9

LINQ to SQL クラスでは、外部キーEntitySetオブジェクトから作成されたプロパティが を実装しているのにIEnumerable、 上のオブジェクトが を実装してDataContextいるオブジェクトであるのはなぜですか?TableIQueryable

編集:明確にするために、これは私が理解しようとしていることを示す例です。この例:

ctx.Matches.Where(x => x.MatchID == 1).Single()
           .MatchPlayers.Max(x => x.Score);

データベースに 2 回ヒットします。

ctx.MatchPlayers.Where(x => x.MatchID == 1)
                .Max(x => x.Score);

1 つのクエリのみを実行します。トレースは次のとおりです。

exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date]
FROM [dbo].[Matches] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go

exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go

これは、さらに悪いことに、データベースではなく C# レベルで最大化が行われていることも示しています。

IQueryableこれが発生する理由はs とs の違いであることはわかっています。したがって、最初の例のオブジェクトは、後者の例と同じ利点を得るためにインターフェイスを実装IEnumerableしないのはなぜですか。MatchPlayersIQueryable

4

3 に答える 3

3
ctx.Matches.Where(x => x.MatchID == 1).Single()

Single() は、IQueryable(Match) ではなく、Match を返します。

Single() を最後のステップに押し込むだけです。

ctx.Matches
  .Where(m => m.MatchID == 1)
  .Select(m => m.MatchPlayers.Max(mp => mp.Score))
  .Single();

このクエリが示しているのは、クエリで MatchPlayers プロパティを使用しても問題ないということです。これは、質問者の質問に対する私の解釈に対応しています-「クエリでEntitySetを使用できないのはなぜですか?」、できます。

于 2008-10-14T15:32:50.797 に答える
1

テーブルは事実上概念的な問題です。実際にはサーバー上に存在するため、エントリを取得するにはクエリを実行する必要があります。外部キー エントリは、別のクエリによって実際に取得されたものであるため、その時点でローカルで使用できます。これはかなり馬鹿げた説明ですが、うまくいけば、一般的な概念を乗り越えることができます。

于 2008-10-14T11:29:21.243 に答える
0

これは、MSDN フォーラムで解決されました。理由の要点は、データベースに対してクエリを実行しているときに追加および削除されたオブジェクトを追跡するのは非常に難しいということです。代わりに、EntitySet は、操作可能な関連オブジェクトのローカル コピーのようなものです。残念ながら、お気付きのように、これには LINQ to SQL のパフォーマンスが向上する代わりに、式が LINQ to Objects 呼び出しに委譲されるという副作用があります。

于 2009-02-24T18:49:36.220 に答える