Frage

Ich schreibe eine LINQ to SQL-Anweisung und bin auf der Suche nach der Standardsyntax für einen normalen Inner Join mit einem ON Klausel in C#.

Wie stellen Sie Folgendes in LINQ to SQL dar:

select DealerContact.*
from Dealer 
inner join DealerContact on Dealer.DealerID = DealerContact.DealerID
War es hilfreich?

Lösung

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}

Für ein besseres Beispiel wäre es schön, sinnvolle Namen und Felder für Ihre Tabellen zu haben.:) :)

Aktualisieren

Ich denke, für Ihre Anfrage könnte dies passender sein:

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

Denn Sie suchen die Kontakte, nicht die Händler.

Andere Tipps

Und weil ich die Ausdruckskettensyntax bevorzuge, sehen Sie hier, wie Sie das damit machen:

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

Um die Syntax der Ausdruckskette zu erweitern Antwort von Clever Human:

Wenn Sie Dinge (z. B. Filtern oder Auswählen) auf Felder aus beiden Tabellen ausführen möchten, die miteinander verbunden werden – und nicht nur auf eine dieser beiden Tabellen – können Sie im Lambda-Ausdruck des letzten Parameters der Join-Methode ein neues Objekt erstellen Einbindung beider Tabellen, zum Beispiel:

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 dieses Beispiels:

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

...wo wir ein neues Objekt vom anonymen Typ erstellen, das als Eigenschaften die Datensätze DealerContact und Dealer sowie alle ihre Felder hat.

Wir können dann beim Filtern und Auswählen der Ergebnisse Felder aus diesen Datensätzen verwenden, wie der Rest des Beispiels zeigt, das verwendet dc_d als Name für das von uns erstellte anonyme Objekt, dessen Eigenschaften sowohl die Datensätze „DealerContact“ als auch „Dealer“ sind.

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

Verwenden Linq Beitreten Operator:

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

Sie erstellen einen Fremdschlüssel und LINQ-to-SQL erstellt Navigationseigenschaften für Sie.Jede Dealer wird dann eine Sammlung von haben DealerContacts 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 keine Navigationseigenschaften verwenden, verpassen Sie einen der Hauptvorteile von LINQ-to-SQL – den Teil, der das Objektdiagramm zuordnet.

im Grunde LINQ verbinden Der Operator bietet keinen Vorteil für SQL.D.h.die folgende Abfrage

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

führt zu INNER JOIN in SQL

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

from contact in db.DealerContact  

Die Klausel würde für jeden erneut ausgeführt HändlerBei IQueryable<> ist dies jedoch nicht der Fall.Auch verbinden ist weniger flexibel.

Tatsächlich ist es oft besser, nicht beizutreten, das heißt in Linq.Wenn Navigationseigenschaften vorhanden sind, können Sie Ihre Linq-Anweisung sehr prägnant schreiben:

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

Es lässt sich in eine where-Klausel übersetzen:

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

Verwenden LINQ tritt bei um Inner Join durchzuführen.

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

Versuche dies :

     var data =(from t1 in dataContext.Table1 join 
                 t2 in dataContext.Table2 on 
                 t1.field equals t2.field 
                 orderby t1.Id select t1).ToList(); 
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(); 
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 Studenten- und Kurstabellen eine Primärschlüssel- und Fremdschlüsselbeziehung haben

Versuchen Sie stattdessen Folgendes:

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

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

Inner Join zweier Tabellen in Linq C#

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 }

Ein bestes Beispiel

Tabellennamen: 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}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top