使用与实体相关的自定义方法

本文关键字:自定义方法 实体 | 更新日期: 2023-09-27 17:50:47

我有一个Person表在我的数据库有NationalId字段。是否有任何方法加载所有人甚至NationalId,使用Ef code firstLinq to entities,而不加载所有Person s到内存?

运转:

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();

但这并不理想,因为它会加载所有person,然后过滤IsEven

Edit:考虑一下,如果你不想每次都内联编写,你也可以为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();
}