2008-09-01 7 views
357

Ich schreibe eine LINQ to SQL-Anweisung, und ich bin nach der Standardsyntax für einen normalen inneren Join mit einer ON-Klausel in C#.Wie lautet die Syntax für einen inneren Join in LINQ to SQL?

Wie stellen Sie die folgenden in LINQ to SQL:

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

Sie können [SQL-Abfragen in LINQ] (http://www.codeducky.org/sql-queries-in-linq/#inner-join) hilfreich finden.Es wird erläutert, wie gängige SQL-Abfragen, einschließlich innerer Joins, in die LINQ-Syntax konvertiert werden. –

+0

Wenn Sie einen Fremdschlüssel zwischen den Tabellen haben, sollten Sie unten Kirk Broadhurst Antwort suchen. – Guilherme

+1

Sie sollten Ihre Tabellennamen pluralieren. Ein Tisch, der viele Händler enthält, sollte als * Händler * und nicht als Händler bezeichnet werden. – ANeves

Antwort

470

Es geht ungefähr so:

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

Es wäre schön, sinnvolle Namen und Felder für Ihre Tabellen für eine bessere haben Beispiel. :)

aktualisieren

ich für Ihre Anfrage denke, das besser geeignet sein könnte:

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

Da Sie für die Kontakte suchen, nicht die Händler.

+3

danke, von jetzt an werde ich ** sensible Namen ** als Best Practice verwenden, die Sinn macht in linq, anstatt von 'von c oder von t1' – stom

25

Verwenden Linq Join Betreiber:

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

was zu tun, wenn ich Spalten von beiden d & dc wollen? –

+0

@KuntadyNithesh Dann geben Sie eine Klasse zurück, die Sie erstellt haben, wie zum Beispiel MyCustomer auswählen {Id = dc.id, Id2 = d.id} Das ist es! – Elisabeth

36
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(); 
+0

Hallo, Können Sie mir bitte sagen, worum es in diesem Teil geht? Status = (ContactStatus) c.StatusID I expecially im Fragment interessiert bin: (ContactStatus) c.StatusID Grüße Mariusz – Mariusz

+0

@aristo - Blick auf den Code, ich vermute, dass 'ContactStatus' ist wirklich eine enum, und 'c.StatusID' ist nicht wirklich eine ID, sondern der numerische Wert der enum. Wenn ich recht habe, '' (ContactStatus) c.StatusID' ist wirklich nur eine Ganzzahl in eine Enumeration. –

190

Und weil ich den Ausdruck Kette Syntax bevorzugen, hier ist, wie Sie es mit dem zu tun:

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

Wenn Sie Felder aus * beiden * verknüpften Tabellen filtern oder auswählen müssen, anstatt nur auf Felder einer der beiden Tabellen (die Tabelle DealerContact im Beispiel dieser Antwort), sehen Sie hier ein Beispiel: http://stackoverflow.com/ a/29310640/12484 –

22

LINQ im Grunde beitreten Operator bietet kein Vorteil für SQL. I.e. Die folgende Abfrage

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

in INNER JOIN in SQL führt

beitreten für IEnumerable <> nützlich ist, weil es effizienter ist:

from contact in db.DealerContact 

Klausel würde erneut ausgeführt für jeder Händler Aber für IQueryable <> ist es nicht der Fall. Auch Join ist weniger flexibel.

18

Sie erstellen einen Fremdschlüssel und LINQ-to-SQL erstellt Navigationseigenschaften für Sie. Jeder Dealer wird dann eine Sammlung von DealerContacts haben, die Sie auswählen, filtern und bearbeiten können.

from contact in dealer.DealerContacts select contact 

oder

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

Wenn Sie nicht Navigationseigenschaften verwenden, die Sie verpassten eines der wichtigsten Vorteile auf LINQ to SQL - der Teil, der den Objektgraphen abbildet.

+0

Oh man, du hast mir die Zeit gespart, ich muss nicht mehr mit diesen dämlichen Verbindungen fertig werden! – Tomas

9

Eigentlich ist es oft besser, nicht beizutreten, in linq ist das.Wenn Navigationseigenschaften eine sehr prägnante Art und Weise ist Ihre Linq-Anweisung zu schreiben:

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

Er übersetzt zu einem where-Klausel:

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

Wie sieht eine LINQ-Abfrage mit mehreren "from" -Klauseln (wie in diesem Beispiel) in der Ausdruckskettensyntax aus? Ist es möglich? –

+1

Die Methodensyntax ist 'SelectMany()'. –

1
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 }; 

Wo Schüler und Kurs Tabellen Primärschlüssel und Fremd Schlüsselbeziehung

-7

One Bestes Beispiel

Tabelle Namen: TBL_Emp und 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} 
+4

Bitte lesen Sie diesen FAQ-Artikel: [Darf ich Produkte oder Websites bewerben, mit denen ich hier in Verbindung stehe?] (Http://stackoverflow.com/faq#promotion). – Artemix

+2

Der Typ, den Sie in foreach (char) verwenden, funktioniert nicht. – SRO

2

Verwenden LINQ joins auszuführen Inner Join.

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 
        }; 
1

versuchen stattdessen diese,

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

Try this:

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

Um die Expression Kette Syntax answer durch Clever Menschen zu erweitern:

Wenn Sie Dinge tun wollte (wie filter oder select) auf Felder aus beiden Tabellen zusammengefügt werden - stattdessen auf nur einer davon zwei Tabellen - Sie könnten ein neues Objekt in dem Lambda-Ausdruck des endgültigen Parameters auf die Join-Methode enthalten diese beiden Tabellen, zum Beispiel erstellen:

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 }); 

Der interessante Teil ist der Lambda-Ausdruck in Zeile 4, dass Beispiel:

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

... wo wir ein neues anonyme-Typ-Objekt erstellen, das die Händler suchen und Händleraufzeichnungen als Eigenschaften, zusammen mit all ihren Bereichen.

Wir können dann Felder verwenden, um von diesen Datensätzen, wie wir die Ergebnisse filtern und wählen Sie, wie durch den Rest des Beispiels demonstriert, die dc_d als Name für das anonyme Objekt verwendet wir gebaut, die sowohl die Händler suchen und Händleraufzeichnungen hat als seine Eigenschaften.

+2

Joins mit Lambdas haben furchtbare Syntax. Ich weigere mich, es zu benutzen ;-) – Mariusz

+5

@aristo Ich mache dir überhaupt keine Vorwürfe. Normalerweise muss ich auf diesen Beitrag zurückkommen, um mich an die Syntax zu erinnern! –

-1

Inner Join Zwei Tabellen in Linq C#

var result =
von q1 in table1
beitreten q2 in table2
auf q1.Customer_Id gleich q2.Customer_Id
neue Option {q1.Name, q1. Mobile, q2.Purchase, q2.Dates}

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

}).ToList(); 
0
var data=(from t in db.your tableName(t1) 
      join s in db.yourothertablename(t2) on t1.fieldname equals t2.feldname 
      (where condtion)).tolist(); 
0
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(); 

Schreiben Sie die gewünschten Tabellennamen und initialisieren Sie die Auswahl, um das Ergebnis der Felder zu erhalten.

+0

var list = (von u in db.Yourfirsttablename verbinden c in db.secondtablename auf u.firsttablecommonfields gleich c.secondtablecommon Feld wo u.Username == Benutzername neu wählen {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() ; –

1
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(); 
+0

Willkommen bei Stack Overflow! Während dieses Code-Snippet die Frage lösen kann, hilft [einschließlich einer Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erläuternden Kommentaren zu überladen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen verringert! – FrankerZ