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

C# 这两个linq查询之间有什么区别吗?,c#,linq,many-to-many,C#,Linq,Many To Many,想象一下作者和项目之间的多对多关系 在查询项目的作者时,似乎有两种广泛的方法(下面的示例) 为什么我可以选择一种方法而不是另一种 下面两个查询的SQL生成方式有什么不同吗 方法一 按ID查找项目,然后使用Authors属性列出作者 List<Authors> Authors = db.Items .Where(i => i.ID == CurrentItemID) .FirstOrDefault() .Authors.ToList(); 方法2给了我:

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

在查询项目的作者时,似乎有两种广泛的方法(下面的示例)

为什么我可以选择一种方法而不是另一种

下面两个查询的SQL生成方式有什么不同吗

方法一

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

List<Authors> Authors = db.Items
    .Where(i => i.ID == CurrentItemID)
    .FirstOrDefault()
    .Authors.ToList();
方法2给了我:

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
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,一旦找到项目,您只需选择列出的所有作者即可

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


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

为什么不检查生成的SQL看起来如何?好主意。我该怎么做呢?我对整个linq/.net/mvc thingRemove
ToList
调用相当陌生,然后使用调试器或简单地调用
ToString
来获取语句。很简单,好的,谢谢,让我们知道结果是什么。我对此很好奇。当你完成后,你可能应该发布一个答案。谢谢Mateo。那也是我的感觉。但我已经看到了足够多的其他方法的例子,我想知道是否有任何理由选择这种方法。
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
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]) 
)