如何在调用 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检索数据。