繁体   English   中英

这两个linq查询之间有什么区别吗?

[英]Is there any difference between these 2 linq queries?

想象一下作者和项目之间的多对多关系。

查询项目的作者时,似乎有2种广泛的方法(以下示例)。

为什么我会选择一种方法而不是另一种方法?

以下两个查询的SQL生成方式有何不同?

方法一

通过ID查找项目,然后使用Authors属性列出作者。

List<Authors> Authors = db.Items
    .Where(i => i.ID == CurrentItemID)
    .FirstOrDefault()
    .Authors.ToList();

方法二

查找所有AuthoredItems包含当前项目ID的作者。

List<Authors> Authors = db.Authors
    .Where(i => i.AuthoredItems.Any(a => a.ID == CurrentItemID))
    .ToList();

像这样的多对多关系:

public class Item
{
    ...
    ICollection<Author> Authors {get;set;}
}

public class Author
{
    ...
    ICollection<Item> AuthoredItems {get;set;}
}

UPDATE

根据建议,我尝试为这些查询打印生成的sql。

方法1给我:

SELECT 
[Project1].[ID] AS [ID], [Project1].[Title] AS [Title], 
[Project1].[C1] AS [C1], [Project1].[ID1] AS [ID1], 
[Project1].[Name] AS [Name] 

FROM ( 
  SELECT [Extent1].[ID] AS [ID], 
    [Extent1].[Title] AS [Title], 
    [Join1].[ID] AS [ID1], 
    [Join1].[Name] AS [Name], 
    CASE WHEN ([Join1].[Author_ID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1] FROM [dbo].[Items] AS [Extent1] 

  LEFT OUTER JOIN (
    SELECT [Extent2].[Author_ID] AS [Author_ID], 
    [Extent2].[Item_ID] AS [Item_ID], 
    [Extent3].[ID] AS [ID], [Extent3].[Name] AS [Name] 
    ROM [dbo].[AuthoredItems] AS [Extent2] 
    INNER JOIN [dbo].[Authors] AS [Extent3] ON [Extent3].[ID] = [Extent2].[Author_ID] 
  ) 
  AS [Join1] ON [Extent1].[ID] = [Join1].[Item_ID] 
  WHERE 1 = [Extent1].[ID] 
) 
AS [Project1] 
ORDER BY [Project1].[ID] ASC, [Project1].[C1] ASC

方法2给我:

SELECT [Extent1].[ID] AS [ID], [Extent1].[Name] AS [Name] 
FROM [dbo].[Authors] AS [Extent1] 
WHERE EXISTS (
  SELECT 1 AS [C1] FROM [dbo].[AuthoredItems] AS [Extent2] 
  WHERE ([Extent1].[ID] = [Extent2].[Author_ID]) AND (1 = [Extent2].[Item_ID]) 
)

第二种方法中的sql在我的脑海中容易得多。 而且联接的数量也更少了。我对吗,第二种方法会更有效吗?

第一个查询似乎更“自然”,更容易理解,因为您知道商品ID,并且一旦找到商品,就选择所有列出的作者。

在另一个查询中,您查找每个作者是否是项目的作者,如果是,则选择他。

我会选择第一个。 我不确定两个查询的速度差异,但是第一个查询肯定更容易理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM