5

私はいくつかのエンティティ フレームワーク コードを制御しており、それをリファクタリングしようとしています。その前に、自分の考えが正しいか、エンティティ フレームワークのやり方を見逃していないかを確認したいと思います。

例 1 - サブクエリと結合

ここでは、A と B の間に 1 対多があります。以下のコードは読みにくいだけでなく、非効率的ですか?

from a in dataContext.As
where ((from b in dataContext.Bs
        where b.Text.StartsWith(searchText)
        select b.AId).Distinct()).Contains(a.Id)
select a

たとえば、結合を使用してこのようなことを行う方が良いでしょうか?

from a in dataContext.As
where a.Bs.Any(b => b.Text.StartsWith(searchText))
select a

例 2 - 明示的な結合とナビゲーション

ここでは、A と B の間は 1 対多、B と C の間は 1 対多です。

from a in dataContext.As
join b in dataContext.Bs on b.AId equals a.Id
join c in dataContext.Cs on c.BId equals b.Id
where c.SomeValue equals searchValue
select a

データ モデルをナビゲートするのではなく、明示的な結合を使用する正当な理由はありますか? 例えば:

from a in dataContext.As
where a.Bs.Any(b => b.Cs.Any(c => c.SomeValue == searchValue)
select a
4

1 に答える 1

0

場合によっては、結合スタイルとサブクエリを使用して、LINQ 2 SQL クエリの特定の側面を制御する必要があります。ここではそうではありません。「ナビゲーション」スタイルが厳密に推奨されます。場合によっては、LINQ to SQL がよりスマートな SQL パターンを使用しているため、パフォーマンスが向上することさえあります。

「あなたが正しい」とだけ答えたいわけではないので、私は LINQ to SQL の経験が豊富です。パフォーマンスが重要であり、生成されたほとんどすべての SQL ステートメントが私によってパフォーマンス テストされている 2 つの大きなプロジェクトで使用しています。したがって、この回答にはある程度の権威があり、ランダムなインターネットの意見ではありません.

于 2012-12-18T11:02:12.227 に答える