在 linq to entities 中使用自定义方法
Using custom methods in linq to entities
我的数据库中有一个 Person
table,它有 NationalId
字段。
有什么方法可以使用 Ef code first
和 Linq to entities
加载所有 NationalId
的人,而无需将所有 Person
加载到内存中?
类似于:
public bool IsEven(int number)
{
return number % 2 == 0;
}
var context = new MyContext();
var personsWithEvenNationalId = context.Persons
.Where(x=> IsEven(x.NationalId))
.ToList();
您必须在线检查
var personsWithEvenNationalId = context.Persons
.Where(x=> x.NationalId%2 == 0)
.ToList();
Linq to Entities 基本上不知道如何将自定义方法转换为 SQL。如果您确实需要使用自定义方法,则必须将 Persons 设置为可枚举的,然后使用您的自定义方法,即
var personsWithEvenNationalId = context.Persons
.AsEnumerable()
.Where(x=> IsEven(x.NationalId))
.ToList();
但这并不理想,因为它会加载所有人员,然后在 IsEven 上进行过滤
编辑: 考虑一下,如果您不想每次都以内联方式编写,您还可以为 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();
您需要一个函数(或 属性 或字段)来提供 Expression
来执行您想要的投影,而不是一个函数来执行您想要的操作:
public static Expression<Func<int, bool>> IsEven()
{
return number => number % 2 == 0;
}
您现在可以写:
using(var context = new MyContext())
{
var personsWithEvenNationalId = context.Persons
.Select(x=> x.NationalId)
.Where(IsEven())
.ToList();
}
我的数据库中有一个 Person
table,它有 NationalId
字段。
有什么方法可以使用 Ef code first
和 Linq to entities
加载所有 NationalId
的人,而无需将所有 Person
加载到内存中?
类似于:
public bool IsEven(int number)
{
return number % 2 == 0;
}
var context = new MyContext();
var personsWithEvenNationalId = context.Persons
.Where(x=> IsEven(x.NationalId))
.ToList();
您必须在线检查
var personsWithEvenNationalId = context.Persons
.Where(x=> x.NationalId%2 == 0)
.ToList();
Linq to Entities 基本上不知道如何将自定义方法转换为 SQL。如果您确实需要使用自定义方法,则必须将 Persons 设置为可枚举的,然后使用您的自定义方法,即
var personsWithEvenNationalId = context.Persons
.AsEnumerable()
.Where(x=> IsEven(x.NationalId))
.ToList();
但这并不理想,因为它会加载所有人员,然后在 IsEven 上进行过滤
编辑: 考虑一下,如果您不想每次都以内联方式编写,您还可以为 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();
您需要一个函数(或 属性 或字段)来提供 Expression
来执行您想要的投影,而不是一个函数来执行您想要的操作:
public static Expression<Func<int, bool>> IsEven()
{
return number => number % 2 == 0;
}
您现在可以写:
using(var context = new MyContext())
{
var personsWithEvenNationalId = context.Persons
.Select(x=> x.NationalId)
.Where(IsEven())
.ToList();
}