C# 选择…使用linq的最佳方式
数据库中有三个相关的表。倡导者、供应商和倡导者/供应商 Advocate_Vendor表是多对多链接,有一个vendorId和一个advocateId 我的最终目标是找回一个C# 选择…使用linq的最佳方式,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,数据库中有三个相关的表。倡导者、供应商和倡导者/供应商 Advocate_Vendor表是多对多链接,有一个vendorId和一个advocateId 我的最终目标是找回一个列表对象…一个属于某个供应商的倡导者集合。我写道: var list = new List<Advocate>(); foreach (var vendorAdvocates in db.Advocate_Vendors) { if (vendorAdvo
列表
对象…一个属于某个供应商的倡导者集合。我写道:
var list = new List<Advocate>();
foreach (var vendorAdvocates in db.Advocate_Vendors)
{
if (vendorAdvocates.VendorId == vendorId)
{
list.Add(db.Advocates.SingleOrDefault(a => a.AdvocateId == vendorAdvocates.AdvocateId));
}
}
这是最好的方式吗?这似乎是错误的,好像可能有一种更简化的方法来实现这一点,使用“包含”关键字或一些看起来更可读的东西……获得所有供应商的支持
谢谢在倡导者供应商和倡导者之间使用
连接将是正确的方式
var list = (from vendorAdvocates in db.Advocate_Vendors
join advocates in db.Advocates
on vendorAdvocates.AdvocateId equals advocates.AdvocateId
where vendorAdvocates.VendorId == vendorId
select advocates).ToList();
如果您正确设置了外键和导航属性,则应该可以这样编写:
var list = (from vendorAdvocates in db.Advocate_Vendors
where vendorAdvocates.VendorId == vendorId
select db.Advocate).ToList();
避免使用包含的
,这会很慢。您应该在模型中定义导航属性,它们正是为您做这件事的。这不完全相同。如果给定的代理供应商没有匹配的代理,此方法将不会在结果列表中插入相应的null。我不确定这是否是原始查询的一个重要部分,但这似乎是故意的,因此值得注意。是的,供应商可能没有支持者,感谢noteInsert?这是唯一的选择!是的,这是一个选择,但它会生成一个列表
。我使用的“插入”一词指的是结果列表的填充。@Magnus:entity framework是否为我的答案和你的答案生成了不同的查询?只是好奇而已。@mynkow这些查询看起来会有所不同,您的查询使用的是交叉连接
,而我的查询使用的是内部连接
,但执行计划将是相同的。(内部连接)此解决方案不会为没有相应倡导者的倡导者供应商生成任何记录。从技术上讲,这与最初的实现有所不同。@recursive从阅读“获取属于一个供应商的倡导者集合”这一问题开始,我认为op不需要一个左连接
@Magnus:NHibernate正好相反:)。很高兴知道这一点。
var list = (from vendorAdvocates in db.Advocate_Vendors
join advocates in db.Advocates
on vendorAdvocates.AdvocateId equals advocates.AdvocateId
where vendorAdvocates.VendorId == vendorId
select advocates).ToList();
var list = (from vendorAdvocates in db.Advocate_Vendors
where vendorAdvocates.VendorId == vendorId
select db.Advocate).ToList();