0

LINQ を使用してリストを作成しています。しかし、最後に関数を使用してオブジェクト自体を生成したいのですが、LINQが不満を言っています

LINQ to Entities does not recognize the method 'WashroomStatusItem GetWashroomStatusForItem(WashroomStatus)' method, and this method cannot be translated into a store expression.

私は何を間違っていますか?

var query = (from c in context.WashroomStatus
    where c.WashroomId == GroupItem.WashroomID
    select GetWashroomStatusForItem(c));

private WashroomStatusItem GetWashroomStatusForItem(WashroomStatus item)
{
    WashroomStatusItem temp = new WashroomMonitorWCF.WashroomStatusItem();
    //do stuff with it
    return temp;
}
4

2 に答える 2

7

問題は、SQL 変換でメソッドを SQL に変換できないことです。AsEnumerable()アウトプロセス プロバイダーから LINQ to Objects に "切り替える"ために使用する必要があります。例えば:

var query = context.WashroomStatus
                   .Where(c => c.WashroomId == GroupItem.WashroomID)
                   .AsEnumerable()
                   .Select(c => GetWashroomStatusForItem(c));

一部のプロパティのみを使用する場合GetWashroomStatusForItemは、サーバーから取得する情報の量を減らすために、最初にそれらに個別に投影することをお勧めします。

var query = context.WashroomStatus
                   .Where(c => c.WashroomId == GroupItem.WashroomID)
                   .Select(c => new { c.Location, c.Date };
                   .AsEnumerable()
                   .Select(p => GetWashroomStatusForItem(p.Location, p.Date));
于 2012-09-06T14:59:47.497 に答える
0

Jon Skeetの答えは正しいですが、の性質に応じて、GetWashroomStatusForItem()おそらくLINQステートメントに分割してクエリ自体に追加するか、クエリが返された後に実行する必要があると付け加えます。

したがって、GetWashroomStatusForItem()次のように見えるとしましょう。これは非常に単純化しすぎていることに注意してください。

public static WashroomStatus GetWashroomStatusForItem(Item c)
{
    return c.WashroomStatus;
}

次のように LINQ クエリに追加するだけです。

var query = (from c in context.WashroomStatus
    where c.WashroomId == GroupItem.WashroomID
    select c.WashroomStatus);

しかし、データベースにないものに大きく依存している場合は、 を取得する前に Linq ステートメントを終了し、結果WashroomStatusを呼び出しGetWashroomStatusForItem()ます。Linq は遅延評価を使用するため、パフォーマンスの違いはありません。一般に、データベース操作を「プログラムによる」操作とは別に維持する必要があります。

于 2012-09-06T15:23:31.643 に答える