LINQ to SQLの内部結合の構文は何ですか?


443

私はLINQ to SQLステートメントを書いていて、通常の内部結合の標準構文の後に ON、C#の句を使用し。

LINQ to SQLで以下をどのように表現しますか?

select DealerContact.*
from Dealer 
inner join DealerContact on Dealer.DealerID = DealerContact.DealerID

テーブル間に外部キーがある場合は、以下のKirk Broadhurstの回答を参照してください。
ギルヘルメ2016年

1
テーブル名は複数形にする必要があります。多くのディーラー(についてのエントリー)を保持するテーブルは、ディーラーではなく、ディーラーと呼ばれる必要があります。
ANeves 2017

5
@ANeves複数のテーブル名を使用することは標準的な慣習とはほど遠く、単数と複数の両方が完全に受け入れ可能です-オブジェクト名と一致させるために、私は複数から単数に自分自身を切り替えました-ここで、トップの回答は単数がより一貫していることを同意します(多くの複数形は奇妙または非存在しない-たとえば'1匹の羊、8羊':stackoverflow.com/questions/338156/...
niico

@niicoこれは議論する場所ではないと思います...しかし、Microsoft Entity Framework はテーブル名を複数形にし、Ruby on RailsのORM はテーブルを複数形にします...それは標準的な実践に十分近いですか?:)反論:NHibernate はテーブルを複数形にしないようです。
ANeves 2018年

2
確かに-一部の人々はある方法でそれを行います-一部の人々はそれを別の方法で行います。標準的な方法はありません。個人的には、単数の方がはるかに多くの利点があると思います。
niico

回答:


572

それは次のようになります:

from t1 in db.Table1
join t2 in db.Table2 on t1.field equals t2.field
select new { t1.field2, t2.field3}

より良い例として、テーブルにわかりやすい名前とフィールドを用意しておくとよいでしょう。:)

更新

あなたの質問にはこれがより適切かもしれません:

var dealercontacts = from contact in DealerContact
                     join dealer in Dealer on contact.DealerId equals dealer.ID
                     select contact;

あなたが連絡先を探しているので、ディーラーではありません。


11
私が使用する上で、今から、あなたに感謝賢明な名前 LINQで理にかなっているベストプラクティスとして、代わりにfrom c or from t1
shaijut

231

そして、私は式チェーン構文を好むので、ここでそれを行う方法を示します。

var dealerContracts = DealerContact.Join(Dealer, 
                                 contact => contact.DealerId,
                                 dealer => dealer.DealerId,
                                 (contact, dealer) => contact);

8
2つのテーブルの1つ(この回答の例ではDealerContactテーブル)のフィールドだけでなく、結合された両方のテーブルのフィールドをフィルターまたは選択する必要がある場合の例は次のとおりです:stackoverflow.com/a/29310640/12484
Jonシュナイダー

52

Clever Humanによる式チェーン構文の回答を拡張するには:

結合されている両方のテーブルのフィールドで(フィルターや選択など)何かを実行したい場合(これら2つのテーブルの1つだけではなく)、Joinメソッドの最後のパラメーターのラムダ式に新しいオブジェクトを作成できますこれらのテーブルの両方を組み込む、例えば:

var dealerInfo = DealerContact.Join(Dealer, 
                              dc => dc.DealerId,
                              d => d.DealerId,
                              (dc, d) => new { DealerContact = dc, Dealer = d })
                          .Where(dc_d => dc_d.Dealer.FirstName == "Glenn" 
                              && dc_d.DealerContact.City == "Chicago")
                          .Select(dc_d => new {
                              dc_d.Dealer.DealerID,
                              dc_d.Dealer.FirstName,
                              dc_d.Dealer.LastName,
                              dc_d.DealerContact.City,
                              dc_d.DealerContact.State });

興味深い部分は、その例の4行目のラムダ式です。

(dc, d) => new { DealerContact = dc, Dealer = d }

...ここで、DealerContactとDealerがすべてのフィールドと共に記録するプロパティを持つ新しい匿名型オブジェクトを作成します。

次に、残りの例で示すように、結果をフィルターして選択するときに、これらのレコードのフィールドを使用できdc_dます。これは、DealerContactレコードとDealerレコードの両方をプロパティとして持つ、作成した匿名オブジェクトの名前として使用します。


9
ラムダとの結合はひどい構文を持っています。使用を拒否します;-)
Mariusz

12
@aristo私はあなたをまったく責めません。私は通常、構文を思い出すためにこの投稿を参照する必要があります!
Jon Schneider

2
私のような一部の人々は一貫性を好む。これが、ラムダ構文を具体的に検索する理由です。
0014

43
var results = from c in db.Companies
              join cn in db.Countries on c.CountryID equals cn.ID
              join ct in db.Cities on c.CityID equals ct.ID
              join sect in db.Sectors on c.SectorID equals sect.ID
              where (c.CountryID == cn.ID) && (c.CityID == ct.ID) && (c.SectorID == company.SectorID) && (company.SectorID == sect.ID)
              select new { country = cn.Name, city = ct.Name, c.ID, c.Name, c.Address1, c.Address2, c.Address3, c.CountryID, c.CityID, c.Region, c.PostCode, c.Telephone, c.Website, c.SectorID, Status = (ContactStatus)c.StatusID, sector = sect.Name };


return results.ToList();

1
こんにちは、この部分は何ですか?Status =(ContactStatus)c.StatusIDフラグメントに特に興味があります:(ContactStatus)c.StatusIDよろしくMariusz
Mariusz

1
@aristo-コードを見ると、これContactStatusは本当に列挙型であり、c.StatusID実際にはIDではなく、列挙型の数値であると推測しています。私が正しい場合(ContactStatus)c.StatusIDは、実際には整数を列挙型にキャストしています。
Joel Mueller

25

Linq結合演算子を使用します。

var q =  from d in Dealer
         join dc in DealerConact on d.DealerID equals dc.DealerID
         select dc;

1
dとdcの両方の列が必要な場合はどうすればよいですか?
Kuntady Nithesh 2012

1
@KuntadyNithesh次に、select new MyCustomer {Id = dc.id、Id2 = d.id}のように作成したクラスを返します。
Elisabeth

25

外部キーを作成すると、LINQ-to-SQLによってナビゲーションプロパティが作成されます。各Dealerコレクションには、DealerContacts選択、フィルタリング、および操作できるコレクションがあります。

from contact in dealer.DealerContacts select contact

または

context.Dealers.Select(d => d.DealerContacts)

ナビゲーションプロパティを使用していない場合は、LINQ-to-SQLの主な利点の1つ、つまりオブジェクトグラフをマップする部分がありません。


ああ、あなたは私の時間を節約しました、私はもうこれらの愚かな結合に対処する必要はありません!
トーマス2013年

23

基本的に、LINQ 結合演算子はSQLにメリットをもたらしません。つまり、次のクエリ

var r = from dealer in db.Dealers
   from contact in db.DealerContact
   where dealer.DealerID == contact.DealerID
   select dealerContact;

SQLではINNER JOINになります

結合は、IEnumerable <>の方が効率的であるため便利です。

from contact in db.DealerContact  

句はすべてのディーラーに対して再実行されますが 、IQueryable <>の場合はそうではありません。また、結合は柔軟性が低くなります。


12

実際には、しばしばlinqに参加しない方が良いです。ナビゲーションプロパティがある場合、linqステートメントを記述する非常に簡潔な方法は次のとおりです。

from dealer in db.Dealers
from contact in dealer.DealerContacts
select new { whatever you need from dealer or contact }

これはwhere句に変換されます。

SELECT <columns>
FROM Dealer, DealerContact
WHERE Dealer.DealerID = DealerContact.DealerID

(この例のように)複数の "from"句を含むLINQクエリは、式チェーン構文ではどのように見えますか?出来ますか?
Jon Schneider

1
同等のメソッド構文はSelectMany()です。
ガートアーノルド

3

LINQ結合を使用して内部結合を実行します。

var employeeInfo = from emp in db.Employees
                   join dept in db.Departments
                   on emp.Eid equals dept.Eid 
                   select new
                   {
                    emp.Ename,
                    dept.Dname,
                    emp.Elocation
                   };

3

これを試して :

     var data =(from t1 in dataContext.Table1 join 
                 t2 in dataContext.Table2 on 
                 t1.field equals t2.field 
                 orderby t1.Id select t1).ToList(); 

3
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID orderby od.OrderID select new { od.OrderID,
 pd.ProductID,
 pd.Name,
 pd.UnitPrice,
 od.Quantity,
 od.Price,
 }).ToList(); 

Stack Overflowへようこそ!このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明の両方の読みやすさが低下するため、コードを説明コメントで混雑させないようにしてください。
さようならStackExchange 2018年

2
OperationDataContext odDataContext = new OperationDataContext();    
        var studentInfo = from student in odDataContext.STUDENTs
                          join course in odDataContext.COURSEs
                          on student.course_id equals course.course_id
                          select new { student.student_name, student.student_city, course.course_name, course.course_desc };

学生とコースのテーブルに主キーと外部キーの関係がある場合


2

代わりにこれを試してください、

var dealer = from d in Dealer
             join dc in DealerContact on d.DealerID equals dc.DealerID
             select d;

1
var Data= (from dealer in Dealer join dealercontact in DealerContact on dealer.ID equals dealercontact.DealerID
select new{
dealer.Id,
dealercontact.ContactName

}).ToList();

1
var data=(from t in db.your tableName(t1) 
          join s in db.yourothertablename(t2) on t1.fieldname equals t2.feldname
          (where condtion)).tolist();

1
var list = (from u in db.Users join c in db.Customers on u.CustomerId equals c.CustomerId where u.Username == username
   select new {u.UserId, u.CustomerId, u.ClientId, u.RoleId, u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active,c.ProfilePic}).First();

必要なテーブル名を書き込み、selectを初期化してフィールドの結果を取得します。


var list =(uのdb.Yourfirsttablenameの結合c。db.secondtablenameのc。u.firsttablecommonfieldsのcは、c.secondtablecommonフィールドと等しい。 、u.Username、u.Email、u.Password、u.Salt、u.Hint1、u.Hint2、u.Hint3、u.Locked、u.Active、c.ProfilePic})。First();
Sarfraj Sutar 2017

1

linq C#の2つのテーブルの内部結合

var result = from q1 in table1
             join q2 in table2
             on q1.Customer_Id equals q2.Customer_Id
             select new { q1.Name, q1.Mobile, q2.Purchase, q2.Dates }

1

DealerContracのd1から、d1.dealearidがDealerContracのd2に参加し、d2.dealeridが新しい{dealercontract。*}を選択


Stack Overflowへようこそ!この回答は、既存の回答に何も追加しません。
Jeroen Heier

-6

最高の例

テーブル名: TBL_EmpおよびTBL_Dep

var result = from emp in TBL_Emp join dep in TBL_Dep on emp.id=dep.id
select new
{
 emp.Name;
 emp.Address
 dep.Department_Name
}


foreach(char item in result)
 { // to do}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.