145

与えられた:

TABLE_1次の列で名前が付けられたテーブル:

  • ID
  • ColumnA
  • ColumnB
  • ColumnC

、、 にTABLE_1基づいて 2 回結合するSQL クエリがあります。クエリは次のようになります。ColumnAColumnBColumnC

Select t1.ID, t2.ID, t3.ID
  From TABLE_1 t1
  Left Join TABLE_1 t2 On
       t1.ColumnA = t2.ColumnA
   And t1.ColumnB = t2.ColumnB
   And t1.ColumnC = t2.ColumnC
  Left Join TABLE_1 t3 On
       t2.ColumnA = t3.ColumnA
   And t2.ColumnB = t3.ColumnB
   And t2.ColumnC = t3.ColumnC
... and query continues on etc.

問題:

そのクエリを LINQ で書き直す必要があります。私はそれに刺してみました:

var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on t1.ColumnA equals t2.ColumnA
      && t1.ColumnB equals t2.ColumnA
    // ... and at this point intellisense is making it very obvious
    // I am doing something wrong :(

LINQ でクエリを作成するにはどうすればよいですか? 私は何を間違っていますか?

4

8 に答える 8

276

Linq to SQL での複数の列の結合は少し異なります。

var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on new { t1.ColumnA, t1.ColumnB } equals new { t2.ColumnA, t2.ColumnB }
    ...

匿名型を利用して、比較する複数の列の型を作成する必要があります。

これは最初は混乱するように見えますが、SQL が式から構成される方法に慣れると、はるかに理にかなっていることがわかります。内部では、探しているタイプの結合が生成されます。

EDITコメントに基づいて2番目の結合の例を追加します。

var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on new { A = t1.ColumnA, B = t1.ColumnB } equals new { A = t2.ColumnA, B = t2.ColumnB }
    join t3 in myTABLE1List
      on new { A = t2.ColumnA, B =  t2.ColumnB } equals new { A = t3.ColumnA, B = t3.ColumnB }
    ...
于 2011-03-15T05:09:37.297 に答える
12

Title_Authorsは、プロジェクトの結果を一度に結合し、連鎖を継続する2つのものを検索します

        DataClasses1DataContext db = new DataClasses1DataContext();
        var queryresults = from a in db.Authors                                          
                    join ba in db.Title_Authors                           
                    on a.Au_ID equals ba.Au_ID into idAuthor
                    from c in idAuthor
                    join t in db.Titles  
                    on c.ISBN equals t.ISBN 
                    select new { Author = a.Author1,Title= t.Title1 };

        foreach (var item in queryresults)
        {
            MessageBox.Show(item.Author);
            MessageBox.Show(item.Title);
            return;
        }
于 2012-07-13T05:14:03.173 に答える
12

LINQ2SQL では、内部結合を使用するときに明示的に結合する必要はほとんどありません。

データベースに適切な外部キー関係がある場合、LINQ デザイナーで自動的に関係を取得します (そうでない場合は、デザイナーで手動で関係を作成できますが、実際にはデータベースに適切な関係が必要です)。

親子関係

次に、「ドット表記」を使用して関連するテーブルにアクセスできます

var q = from child in context.Childs
        where child.Parent.col2 == 4
        select new
        {
            childCol1 = child.col1,
            parentCol1 = child.Parent.col1,
        };

クエリを生成します

SELECT [t0].[col1] AS [childCol1], [t1].[col1] AS [parentCol1]
FROM [dbo].[Child] AS [t0]
INNER JOIN [dbo].[Parent] AS [t1] ON ([t1].[col1] = [t0].[col1]) AND ([t1].[col2] = [t0].[col2])
WHERE [t1].[col2] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [4]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

私の意見では、これははるかに読みやすく、結合の実際のメカニズムではなく、特別な条件に集中できます。

編集
これはもちろん、データベース モデルと連携したい場合にのみ適用されます。「モデル外」に参加したい場合は、Quintin Robinsonからの回答のように手動で参加する必要があります

于 2011-03-15T09:27:36.610 に答える
4

複数 (3) の結合が使用されている別の例を挙げたいと思います。

 DataClasses1DataContext ctx = new DataClasses1DataContext();

        var Owners = ctx.OwnerMasters;
        var Category = ctx.CategoryMasters;
        var Status = ctx.StatusMasters;
        var Tasks = ctx.TaskMasters;

        var xyz = from t in Tasks
                  join c in Category
                  on t.TaskCategory equals c.CategoryID
                  join s in Status
                  on t.TaskStatus equals s.StatusID
                  join o in Owners
                  on t.TaskOwner equals o.OwnerID
                  select new
                  {
                      t.TaskID,
                      t.TaskShortDescription,
                      c.CategoryName,
                      s.StatusName,
                      o.OwnerName
                  };
于 2015-05-07T08:50:28.050 に答える