LINQ,我应该加入还是使用嵌套的SELECT NEW

Ref*_*din 9 .net c# linq linq-to-sql

我必须低于2个LINQ语句.它们都返回(看似)相同的结果集.任何人都可以向我解释为什么我应该使用一种方式与另一种方式?它就像"你说土豆,我说土豆;你说番茄,我说番茄"一样简单吗?

以下是LINQ的两种风格 - >

1)以下两个lets是私有方法,它们获取一个ID并返回NAME.

var business = from businesse in context.tblBusinesses
               where businesse.BusinessID == businessID
               join addresse in context.tblAddresses on businesse.BusinessID equals addresse.BusinessID
               let stateName = GetStateNameByID(addresse.StateID)
               let countyName = GetCountyNameByID(addresse.CountyID)
               select new
               {
                   businesse.BusinessName,
                   businesse.ContactName,
                   businesse.EmailAddress,
                   addresse.AddressLine1,
                   addresse.AddressLine2,
                   addresse.AddressLine3,
                   addresse.CityName,
                   State = stateName,
                   addresse.ZipCode,
                   addresse.ZipPlus,
                   County = countyName
               };
Run Code Online (Sandbox Code Playgroud)

2)

var query = from businesse in context.tblBusinesses
            where businesse.BusinessID == businessID
            select new
            {
                businesse.BusinessName,
                businesse.ContactName,
                businesse.EmailAddress,
                Address = from addresse in businesse.tblAddresses 
                          select new 
                          {
                              addresse.AddressLine1,
                              addresse.AddressLine2,
                              addresse.AddressLine3,
                              addresse.CityName,
                              State = addresse.StateID,
                              addresse.ZipCode,
                              addresse.ZipPlus,
                              County = addresse.tblAdminCounty
                          }
            };
Run Code Online (Sandbox Code Playgroud)

Net*_*ide 6

当您观察sql server探查器时,您会看到第二个创建了许多查询,但第一个查询获取了一个查询中的所有数据.所以第一个更有效率.

  • 是的我确信,对于每个企业,它都会为地址创建sql查询.我有类似的经历.如果我使用LINQ,我总是保持我的SQL分析器打开:) (4认同)

dev*_*xer 1

你确定他们给出相同的结果吗?

看起来第一个示例会将您的Address属性扁平化为多个属性,而您的第二个示例将有一个Address本身包含属性的属性。

但除此之外,我想说加入和“内部选择”之间的区别将取决于个人喜好。我可能更喜欢使用联接,因为我习惯于编写 SQL 并且join那里有这个词可以让您的意图显而易见。但我也不认为使用内部选择有问题。