我正在编写一个LINQ to SQL语句,并且需要标准的C#普通内部连接语法,其中包含ON
子句。
在LINQ to SQL中如何表示以下内容:
select DealerContact.*
from Dealer
inner join DealerContact on Dealer.DealerID = DealerContact.DealerID
我正在编写一个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;
既然你正在寻找联系人,而不是经销商。
on t1.field equals t2.field
,但你不能写on t2.field equals t1.field
,因为编译器无法理解在这种情况下t2指的是什么。 - mvanella我更喜欢使用链式表达式语法,这里是如何使用它实现:
var dealerContracts = DealerContact.Join(Dealer,
contact => contact.DealerId,
dealer => dealer.DealerId,
(contact, dealer) => contact);
为了扩展Clever Human的回答中提到的表达式链语法:
如果你想在连接在一起的两个表中对字段执行操作(例如过滤或选择),而不仅仅是其中一个表,你可以在Join方法的最后一个参数的lambda表达式中创建一个结合这两个表的新对象,例如:
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行的lambda表达式:
(dc, d) => new { DealerContact = dc, Dealer = d }
...我们构建一个新的匿名类型对象,其中包含DealerContact和Dealer记录以及它们所有的字段。
然后我们可以在筛选和选择结果时使用这些记录中的字段,正如示例的其余部分所演示的那样,该示例使用dc_d
作为我们构建的匿名对象的名称,它具有DealerContact和Dealer记录作为其属性。
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();
ContactStatus
实际上是一个枚举类型,而c.StatusID
并不是真正的ID,而是枚举的数值。如果我没错的话,(ContactStatus)c.StatusID
只是将一个整数转换为枚举类型。 - Joel Mueller你创建了一个外键,然后LINQ-to-SQL会为你创建导航属性。每个Dealer
都将有一个DealerContacts
集合,你可以选择、过滤和操作。
from contact in dealer.DealerContacts select contact
或者context.Dealers.Select(d => d.DealerContacts)
如果你不使用导航属性,那么你就会错过LINQ-to-SQL的主要优势之一 - 将对象图映射到部分。
使用Linq Join操作符:
var q = from d in Dealer
join dc in DealerConact on d.DealerID equals dc.DealerID
select dc;
基本上,LINQ的join操作符对于SQL没有任何好处。也就是说,以下查询:
var r = from dealer in db.Dealers
from contact in db.DealerContact
where dealer.DealerID == contact.DealerID
select dealerContact;
会导致 SQL 中的 INNER JOIN。
join 对于 IEnumerable<> 很有用,因为它更高效:
from contact in db.DealerContact
对于每个经销商,子句将被重新执行。 但是对于IQueryable<>不是这种情况。此外,join不够灵活。
实际上,在 LINQ 中,通常最好不要使用 JOIN。当存在导航属性时,编写 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
SelectMany()
。 - Gert Arnold在C#的LINQ中使用内连接将两个表连接起来
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 }
试试这个:
var data =(from t1 in dataContext.Table1 join
t2 in dataContext.Table2 on
t1.field equals t2.field
orderby t1.Id select t1).ToList();