您需要在行内进行检查
var personsWithEvenNationalId = context.Persons
.Where(x=> x.NationalId
.ToList();
Linq to Entities不知道如何将您的自定义方法翻译成SQL。如果您确实需要使用自定义方法,您需要将Persons作为可枚举类型获取,然后使用您的自定义方法,即:
var personsWithEvenNationalId = context.Persons
.AsEnumerable()
.Where(x=> IsEven(x.NationalId))
.ToList();
但这并不是理想的解决方案,因为它将加载所有人员,然后过滤偶数。
编辑:考虑一下,如果您不想每次都编写内联方法,也可以为IQueryable<Person>
创建一个扩展方法。可以像这样构建一个Expression
。
public static IQueryable<Person> WhereEven(this IQueryable<Person> source, Expression<Func<Person, int>> property)
{
var expression = Expression.Equal(
Expression.Modulo(
property.Body,
Expression.Constant(2)),
Expression.Constant(0));
var methodCallExpression = Expression.Call(typeof (Queryable),
"where",
new Type[] {source.ElementType},
source.Expression,
Expression.Lambda<Func<Person, bool>>(expression, property.Parameters));
return source.Provider.CreateQuery<Person>(methodCallExpression);
}
并且要使用它:
context.Persons.WhereEven(x => x.NationalId).ToList()
Person
的所有字段而不仅仅是NationalId
怎么办? - Masoud