5

RedGate ftp://support.red-gate.com/ebooks/under-the-hood-of-net-memory-management-part1.pdfによるこの無料の電子ブックから、Linq のパフォーマンスへの影響を理解しようとしています 。

この本の 157-158 ページに、次の例を作成しました。

Order[] pastDueAccounts = null;  
DateTimedueDate = DateTime.Today.AddDays(-7);  
using(varcontext = new Context())    
{  
    pastDueAccounts = context.Accounts.Where(account => account.DueDate < dueDate).ToArray();  
} 

次に、ラムダ式の一部を次の関数にリファクタリングしました。

public bool PastDueAccount(Account account)  
{  
    return account.DueDate < DateTime.Today.AddDays(-7);  
} 

最後に、彼らはこの機能を次のように使用しました。

Order[] pastDueAccounts = null;  
using(varcontext = new Context())  
{  
    pastDueAccounts = context.Accounts.Where(account => PastDueAccount(account)).ToArray();  
} 

これまでの調査に基づいて、LINQ はメソッドを認識できず、ストア式に変換できないため、この linq クエリを実行することはできません。この例は間違っていて単に実行できないのでしょうか、それともこの問題をシミュレートする方法について私が耳を傾けるのに苦労しているだけなのでしょうか?

4

2 に答える 2

8

正解です。これは、表示されている方法で LINQ-to-Entities から呼び出すことはできません。

LINQ-to-Entities で使用できる唯一の方法は、次のとおりです。

于 2012-10-15T20:10:28.463 に答える
3

casperOne が言ったように、関数でそれを行うことはできません。この回答は、必要なことを行う方法です (where フィルターを再利用します)。

アクセスできる場所を作成しExpression、それを再利用できます。

System.Linq.Expressions.Expression<Func<Account, bool>> pastDueAccountFunc = account => account.DueDate < System.Data.Objects.EntityFunctions.AddDays(DateTime.Now, -7);

次に、後で使用します。

var pastDueAccounts = context.Accounts.Where(pastDueAccountFunc);

これは私がこれで使用している完全なコードです:

System.Linq.Expressions.Expression<Func<SomeNeatEntity, bool>> func = x => x.DateCreated < System.Data.Objects.EntityFunctions.AddDays(DateTime.Now, -7);

var entities = new MyEntities();

var t = entities.SomeNeatEntities.Where(func);
Console.WriteLine(t.Count());

var h = entities.SomeNeatEntities.Where(x => x.SomeField != null).Where(func);
Console.WriteLine(h.Count());

MyEntitiesObjectContextプロジェクト内です。
entities.SomeNeatEntitiesですObjectSet<SomeNeatEntity>

于 2012-10-15T20:09:50.920 に答える