在 LINQ 查询中使用 Expression<Func<>>

Jon*_*ood 6 c# linq entity-framework

我想定义一个Func<ProductItemVendor, bool>名为的过滤器表达式CompareProductItemVendorIds,它可以在我的整个应用程序中使用,主要是在实体框架/LINQ 查询中。

我了解到,为了能够在LINQ查询中使用此过滤器,我必须按照其声明Expression<Func<>>,而不是只Func<>。我了解这样做的原因,而且我很容易做到这一点。

但是我在查询中使用该表达式时遇到了以下问题。

首先,代码如:

ProductItem.ProductItemVendors.FirstOrDefault(CompareProductItemVendorIds)
Run Code Online (Sandbox Code Playgroud)

注意:ProductItem是一个数据库实体,它的ProductItemVendors属性是一个导航集合。

产生错误:

`实例参数:无法从“System.Collections.Generic.ICollection”转换为“System.Linq.IQueryable”

其次,代码如:

var results = from v in Repository.Query<ProductItemVendor>()
              where CompareProductItemVendorIds(v)
              select v;
Run Code Online (Sandbox Code Playgroud)

产生错误:

'CompareProductItemVendorIds' 是一个“变量”,但像“方法”一样使用

所以我有我漂亮闪亮的新Expression<Func<>>。如何在我的 LINQ 查询中使用它?

Adu*_*cci 5

ProductItem已经是一个Entity,所以你不能使用你的表达式,你需要使用CompileFunc<> ()从你的中获取Expression<Func<>>,因为 ProductItemVendors 不再是一个IQueryable

ProductItem.ProductItemVendors.FirstOrDefault(CompareProductItemVendorIds.Compile())
Run Code Online (Sandbox Code Playgroud)

您必须在 ProductItemVendorsContext 上使用表达式,如下所示:

var item = Context.ProductItemVendors.FirstOrDefault(CompareProductItemVendorIds);
Run Code Online (Sandbox Code Playgroud)

您不能在查询语法中使用表达式,您需要使用方法 sytanx

var results = from v in Repository.Query<ProductItemVendor>()
                                  .Where(CompareProductItemVendorIds)
              select v;
Run Code Online (Sandbox Code Playgroud)