在 linq toEntity 中使用自定义方法

2023-12-31

我有一个Person我的数据库中的表有NationalId场地。 有没有办法让所有的人都加载均匀NationalId, using Ef code first and Linq to entities,不加载全部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();

但这并不理想,因为它会加载所有 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 linq toEntity 中使用自定义方法 的相关文章

随机推荐