簡體   English   中英

在linq中對實體使用自定義方法

[英]Using custom methods in linq to entities

我的數據庫中有一個包含NationalId字段的Person表。 有沒有辦法先使用Ef code first並將Linq to entities加載Linq to entities ,甚至使用NationalId加載所有Person ,而不將所有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上進行過濾

編輯:考慮一下,如果您不想每次都內聯編寫它,則還可以為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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM