如何在调用 sql 查询时调用 lambda 表达式?
How to invoke lambda expression when calling sql query?
我需要创建一个通用方法 (ContainsLambda
),它接受集合和一个 lambda 表达式(单个 属性)并检查给定的 属性 是否包含给定的集合。
这是我的方法
public static TModel[] ContainsLambda<TModel, TKey>(IEnumerable<TKey> keys, Func<TModel, TKey> property)
{
DbSet<TModel> repository = DbContext.Set<TModel>();
return repository.Where(x => keys.Contains(property.Invoke(x)))
.ToArray();
}
然后我会用这样的方式调用它 ContainsLambda<Customer, int>(new List<int> {10, 20, 30}, p => p.Age)
以上代码抛出以下运行时错误。
LINQ to Entities does not recognize the method 'Int32
Invoke(Customer)' method, and this method cannot be translated into a
store expression.
如何在 LINQ 中使用的 lambda 上调用 .Invoke()
,然后将其转换为 SQL 表达式?
尝试使您的存储库可枚举。这会绕过 Linq to Entities,并导致您的代码在 Linq to Objects 中 运行。
return repository.AsEnumerable()
.Where(x => keys.Contains(property.Invoke(x)))
.ToArray();
如果您不希望存储库中的所有记录都通过网络传输(即您需要在服务器上 运行 进行过滤),则必须 write a custom SQL query检索数据。
我需要创建一个通用方法 (ContainsLambda
),它接受集合和一个 lambda 表达式(单个 属性)并检查给定的 属性 是否包含给定的集合。
这是我的方法
public static TModel[] ContainsLambda<TModel, TKey>(IEnumerable<TKey> keys, Func<TModel, TKey> property)
{
DbSet<TModel> repository = DbContext.Set<TModel>();
return repository.Where(x => keys.Contains(property.Invoke(x)))
.ToArray();
}
然后我会用这样的方式调用它 ContainsLambda<Customer, int>(new List<int> {10, 20, 30}, p => p.Age)
以上代码抛出以下运行时错误。
LINQ to Entities does not recognize the method 'Int32 Invoke(Customer)' method, and this method cannot be translated into a store expression.
如何在 LINQ 中使用的 lambda 上调用 .Invoke()
,然后将其转换为 SQL 表达式?
尝试使您的存储库可枚举。这会绕过 Linq to Entities,并导致您的代码在 Linq to Objects 中 运行。
return repository.AsEnumerable()
.Where(x => keys.Contains(property.Invoke(x)))
.ToArray();
如果您不希望存储库中的所有记录都通过网络传输(即您需要在服务器上 运行 进行过滤),则必须 write a custom SQL query检索数据。