Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 选择…使用linq的最佳方式_C#_Linq_Linq To Sql - Fatal编程技术网

C# 选择…使用linq的最佳方式

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

数据库中有三个相关的表。倡导者、供应商和倡导者/供应商

Advocate_Vendor表是多对多链接,有一个vendorId和一个advocateId

我的最终目标是找回一个
列表
对象…一个属于某个供应商的倡导者集合。我写道:

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