【发布时间】:2014-10-28 20:58:51
【问题描述】:
我想定义一个名为CompareProductItemVendorIds 的Func<ProductItemVendor, bool> 过滤器表达式,它可以在我的整个应用程序中使用,主要是在实体框架/LINQ 查询中。
我了解到,为了能够在 LINQ 查询中使用此过滤器,我必须将其声明为 Expression<Func<>> 而不仅仅是 Func<>。我理解这样做的原因,并且我很容易做到这一点。
但我在查询中使用该表达式时遇到以下问题。
一、代码如:
ProductItem.ProductItemVendors.FirstOrDefault(CompareProductItemVendorIds)
注意:ProductItem 是一个数据库实体,它的ProductItemVendors 属性是一个导航集合。
产生错误:
`实例参数:无法从“System.Collections.Generic.ICollection”转换为“System.Linq.IQueryable”
其次,代码如:
var results = from v in Repository.Query<ProductItemVendor>()
where CompareProductItemVendorIds(v)
select v;
产生错误:
“CompareProductItemVendorIds”是一个“变量”,但用作“方法”
所以我有我漂亮闪亮的新Expression<Func<>>。如何在我的 LINQ 查询中使用它?
【问题讨论】:
-
表达式是对函数的描述,而不是函数本身。为什么不能直接使用
Func<>? -
@Cameron:因为那时我收到错误
The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.请参阅stackoverflow.com/questions/26617623/using-func-in-linq-query。 -
@Seb:在这种情况下,我的理解是它返回查询中的所有项目,然后 然后 在内存中查找匹配项。这是一个非常低效的方法。我试图避免这种情况。
-
ProductItem.ProductItemVendors.FirstOrDefault(CompareProductItemVendorIds)只是一个表达式,你能给出整个语句吗? (当谈到 EF 时,上下文很重要) -
@JonathanWood,相信我,确实如此。
标签: c# linq entity-framework