2

次のような 2 つの from 句を含むクエリがいくつかあります。

var TheResult = from a in MyDC.Table1
                from b in MyDC.Table2
                where a.SomeCol == b.SomeOtherCol
                select new MyModel() {....}

この構文はデカルト結合を作成しているのではないかと懸念しており、1 つの句joinのみを含む構文に書き直したいと考えています。from私の質問は次のとおりです。どのテーブルをfrom句に入れる必要があるかをどのように判断すればよいですか?

ありがとう。

編集: クエリによって生成された t-sql は、SELECT COALESCE((is that a good/bad thing? で始まります。

4

2 に答える 2

0

これをJOINに非常に簡単に書き直すことができます。

var result = from a in MyDC.Table1
             join b in MyDC.Table2 on a.SomeCol equals b.SomeOtherCol
             select new MyModel() { SomeProp = a.SomeCol, SomeProp2 = b.SomeCol }

または、左参加が必要な場合:

var result = from a in MyDC.Table1
             join b in MyDC.Table2 on a.SomeCol equals b.SomeOtherCol
             into myGroup
             from m in myGroup.DefaultIfEmpty()
             select new MyModel() { SomeProp = a.SomeCol, SomeProp2 = m.SomeCol }
于 2012-09-28T00:37:16.687 に答える
0

あなたが提供したモデルはデータ指向が多すぎて、問題を解決する方法を理解するためのオブジェクト指向の感覚がありません。

オブジェクトについて考えると、あなたが持っているものの例は次のようになります:

var TheResult = from u in context.Users
            from c in MyDC.Countries
            where u.CountryId == c.Id
            select new MyModel() { UserName = u.Name, CountryName = c.Name }

そのようなものがあれば、ユーザー (テーブル 1 にマップ) と国 (テーブル 2 にマップ) の間の関係を追加することができます (そうすべきです!)。

var country = user.Country;

これにより、Linq-to-sql によって完全にサポートされている (そして完全に推奨されています!)、より簡単なクエリを実行できます。

var TheResult = from u in context.Users
                select new MyModel() { UserName = u.Name, CountryName = u.Country.Name }  

それが役に立てば幸い。

于 2012-09-28T04:50:00.397 に答える