在 LINQ 查询的 Where 子句中使用 Contains() 函数

3
我使用这段代码从表中获取想要的行列表: ```python code ``` ```html

我使用这段代码从表中获取想要的行列表:

```
_userObjectSet = EntityFrameWorkContext.CreateObjectSet<User>();
List<int> selectedUserIDs = Method(); //Returns a specific set of int user IDs...
var results = _userObjectSet.Where(c => selectedUserIDs.Contains(c.ID)).ToList();

这里的“results”仅包含其ID字段与selectedUserIDs列表中的元素匹配的记录。但问题在于,如果我查看Windows任务管理器,LINQ似乎会加载整个表格的所有行,然后再将它们过滤掉。这个表格中有大量的行,很快进程的重量就超过了1GB,这让我非常不喜欢。我可以看出它是因为完成所花费的时间而这样做的。有没有办法告诉LINQ生成一个查询,它看起来像:
SELECT * FROM Users WHERE ID IN (34,55,66,77, etc.)

有什么方法可以只返回我所要查找的精确行,并且使用更少的内存?

谢谢!


这个表格包含800,000多行,而列表只有大约3000行。我肯定可以运行分析器。 - Francis Ducharme
5
使用3000个项目的SQL In语句是很多的。当列表项少于某个特定数量时,查询提供程序可能只能创建In子句。理想情况下,ID值不应该在代码中以列表形式出现,而应该在数据库中的另一张表格中,并通过Join操作连接。即使ID是临时的,将它们插入到临时表中然后进行Join操作也可能是值得的。 - Servy
2
@Francis,ID“List”是从另一个数据库查询生成的吗?是否有可能将其作为代表其他查询的“IQueryable<int>”获取数据,而不是一系列项目的列表? - Servy
你试过用join吗? - Nowshath
尝试了Servy提出的建议,使用IQueryable<>,它可以正常工作。 - Francis Ducharme
显示剩余12条评论
2个回答

0

试试加入...我认为你会发现不同之处...

List<int> selectedUserIDs = Method(); //Returns a specific set of int user IDs...
var results = (from u in _userObjectSet 
               join id in selectedUserIDs on u.Id equals id
               select u);

-1
你需要类似于LinqKit这样的东西。具体来说,看一下该套件附带的PredicateBuilder,因为我认为你需要它来解决你的问题。

不太确定这会不会奏效,因为 List 的大小很大(3000个项目)。 - Servy
虽然这是一个有用的链接,但我不确定这个答案有多大帮助,因为里面没有明显的东西可以解决这个问题。 - Daniel Kelley
我开始打字时没有注意到关于3000个项目的评论(在平板电脑上有点慢)。 - Hanno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接