LINQ to SQL中的内部连接的语法是什么?
我正在编写一个LINQ to SQL语句,并且在C#中使用ON
子句的正常内连接的标准语法。
如何在LINQ to SQL中表示以下内容:
select DealerContact.* from Dealer inner join DealerContact on Dealer.DealerID = DealerContact.DealerID
它是这样的:
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;
既然你正在寻找联系人,而不是经销商。
而且,因为我更喜欢expression式链式语法,所以您可以这样做:
var dealerContracts = DealerContact.Join(Dealer, contact => contact.DealerId, dealer => dealer.DealerId, (contact, dealer) => contact);
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();
使用Linq Join操作符:
var q = from d in Dealer join dc in DealerConact on d.DealerID equals dc.DealerID select dc;
基本上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 <>情况并非如此。 join也不那么灵活。
为了扩展Clever Human的expression式链式语法答案 :
如果你想对两个表中的字段进行相同的操作(比如过滤或select),而不是仅仅在这两个表中的一个表上 – 你可以在Join方法的最后一个参数的lambdaexpression式中创build一个新的对象合并这两个表格,例如:
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行中的lambdaexpression式:
(dc, d) => new { DealerContact = dc, Dealer = d }
…在这里我们构造一个新的匿名types的对象,它具有DealerContact和Dealerlogging的属性,以及它们的所有字段。
然后,我们可以使用这些logging中的字段来筛选和select结果,如示例的其余部分所示,该示例使用dc_d
作为我们构build的匿名对象的名称,该对象同时具有DealerContact和Dealerlogging作为其属性。
你创build一个外键,LINQ-to-SQL为你创build导航属性。 然后,每个Dealer
将拥有一系列DealerContacts
,您可以select,过滤和操作。
from contact in dealer.DealerContacts select contact
要么
context.Dealers.Select(d => d.DealerContacts)
如果您不使用导航属性,那么您就错过了LINQ-to-SQL(映射对象图的部分)的一个主要优点。
其实,往往最好不要join,就是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
使用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 };
尝试这个 :
var data =(from t1 in dataContext.Table1 join t2 in dataContext.Table2 on t1.field equals t2.field orderby t1.Id select t1).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 };
学生和课程表有主键和外键关系
试试这个,
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();
内部连接Linq C#中的两个表
var result =
从表1中的q1开始
在表2中joinq2
在q1.Customer_Id等于q2.Customer_Id
select新的{q1.Name,q1.Mobile,q2.Purchase,q2.Dates}
一个最好的例子
表名称: 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}