gpt4 book ai didi

c# - 在 linq to entities 中使用自定义方法

转载 作者:行者123 更新时间:2023-11-30 21:57:52 24 4
gpt4 key购买 nike

我的数据库中有一个 Person 表,其中包含 NationalId 字段。有没有什么方法可以使用 Ef code firstLinq 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();

但这并不理想,因为它会加载所有 Persons,然后根据 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();

关于c# - 在 linq to entities 中使用自定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30452426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com