Linq 加入查看而不具体化,直到过滤

Posted

技术标签:

【中文标题】Linq 加入查看而不具体化,直到过滤【英文标题】:Linq Join To View Without Materializing Until Filtered 【发布时间】:2014-05-09 20:48:02 【问题描述】:

所以我正在使用 EF,并且我的数据库中有一个视图,其中有太多的记录无法在我的 C# 程序中放入内存。在运行时,我可以获得一个 ID 列表,我希望通过这些 ID 过滤视图,并将其加载到 IEnumerable 中。

现在我想只取回视图中具有 IEnumerable 中的 ID 的记录。使用 Linq 我写:

for v in view
join i in IDs on v.ID equals i.ID
select v

但是,这首先尝试物化视图,然后在内存中进行过滤,这太慢了。有没有办法让我在 Linq 中将过滤推送到数据库,以便在 SQL Server 中进行连接?

我知道我可以创建一个 sproc 并拥有一个带有 ID 的 TVP 并使用 ADO.NET 在数据库端完成这一切,但我很好奇是否有办法使用 EF 和 Linq 来做到这一点。

【问题讨论】:

可以在 linq 中添加where 语句。你想过滤什么? 【参考方案1】:

如果您的 ID 列表大小合理,您可以使用 where,EF 将“包含”翻译为:

ID 在哪里 (1,2,3,4....)

var ids = new List<int>  1, 2, 3, 4 ;

for v in view
where ids.Contains(v.ID)
select v

【讨论】:

以上是关于Linq 加入查看而不具体化,直到过滤的主要内容,如果未能解决你的问题,请参考以下文章

通过使用 LINQ 和 MVVM 过滤两个相同类型的 ObservableCollection 创建一个 ObservableCollection

连接两个表而不根据连接条件过滤数据

(转)LINQ查询操作符之DistinctUnionConcatIntersectExcept

如何在 Laravel 中过滤数据而不刷新页面?

加入内存时,LINQ 查询中的“位置”是不是重要?

使用 LINQ 过滤列表