Mas*_*oud 4 c# linq-to-entities entity-framework ef-code-first
Person我的数据库中有一个NationalId包含字段的表。有没有什么方法可以使用 Even NationalId、 usingEf code first和加载所有 Person Linq to entities,而不将所有Persons 加载到内存中?
像这样的东西:
public bool IsEven(int number)
{
return number % 2 == 0;
}
var context = new MyContext();
var personsWithEvenNationalId = context.Persons
.Where(x=> IsEven(x.NationalId))
.ToList();
Run Code Online (Sandbox Code Playgroud)
您必须进行内联检查
var personsWithEvenNationalId = context.Persons
.Where(x=> x.NationalId%2 == 0)
.ToList();
Run Code Online (Sandbox Code Playgroud)
Linq to Entities 基本上不知道如何将自定义方法转换为 SQL。如果您确实需要使用自定义方法,则必须将 Persons 获取为可枚举,然后使用您的自定义方法,即
var personsWithEvenNationalId = context.Persons
.AsEnumerable()
.Where(x=> IsEven(x.NationalId))
.ToList();
Run Code Online (Sandbox Code Playgroud)
但这并不理想,因为它会加载所有 Person,然后根据 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);
}
Run Code Online (Sandbox Code Playgroud)
并使用它:
context.Persons.WhereEven(x => x.NationalId).ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2962 次 |
| 最近记录: |