2

LINQ クエリで複数の from 句を見たことがありますが、それが TSQL ステートメントにどのように対応するかはわかりません。

var r = from p in products
        from d in departments
        from c in something
        select p;

それは何をしますか?

それはSQLに変換されますSELECT * FROM products, departments, somethingか?

また、selectこの場合の は常に であると想定されていますSelectManyselectが実際に であることをどのように知ることができSelectManyますか?

4

3 に答える 3

3

これは、概念的に次のようなコードに変換されます。

var r = products.SelectMany(p => departments, (p, d) = new { p, d })
                .SelectMany(z => something, (z, c) => new { z, c })
                .Select(zz => zz.z.p);

基本的fromに、最初の後にそれぞれに追加の呼び出しが追加されSelectManyます。from実際、この場合、コンパイラは最後の句の後に があることに気づき、実際にselectは次のように変換されます。

var r = products.SelectMany(p => departments, (p, d) = new { p, d })
                .SelectMany(z => something, (z, c) => z.p);

...しかし、私は「論理的な」形式を最初に考える傾向があります。

この場合、from句内で以前の範囲変数を使用していませんが、次のことができることに注意してください。

var query = from person in people
            from friend in person.Friends
            select person.Name + " is friends with " + friend.Name;
于 2012-02-21T08:02:02.623 に答える
2

それは TSQL ステートメントにどのように対応しますか?

fromそれは、句の使用方法によって異なります。使用する場合:

var query = from d in context.Departments
            from e in context.Employees
            select d;

あなたの質問はCROSS JOIN、使用されている製品と部門の間に関係がないためです。次のようなものです:

SELECT d.* FROM Departments AS d
CROSS JOIN Employees AS e

明らかに、クロス結合を避ける必要があります。代わりに second でナビゲーション プロパティを使用する場合from:

var query = from d in context.Departments
            from e in d.Employees
            select d;

またはのいずれかを使用しますINNER( LEFT JOINEF は、関係の多重度マッピングに基づいてどちらを使用するかを決定します)。次のようなものです:

SELECT d.* FROM Departments AS d
LEFT OUTER JOIN Employees AS e ON d.Id = e.DepartmentId
于 2012-02-21T08:59:22.550 に答える
0

この場合、select を使用しても意味がありません (意味的に正しくないため、SelectMany を使用する必要があります)。

于 2012-02-21T08:04:19.017 に答える