【问题标题】:Linq Distinct SQL StatementetLinq Distinct SQL 语句集
【发布时间】:2017-05-15 11:42:01
【问题描述】:

我尝试使用 Distinct() 和一些可查询的代码,如下所示:

var finalWhere = Expression.Lambda<Func<Data.DataModel.TrialSummary, bool>>(containsMethod, parameter);

queryableTrialSummary = queryableTrialSummary.Where(finalWhere).Distinct();

var trials = queryableTrialSummary.Select(x => x.Trial_Code).Distinct();

但我发现为 distinct 生成的 SQL 语句如下;

SELECT 
    [Distinct1].[Trial_Code] AS [Trial_Code]
    FROM ( SELECT DISTINCT 
        [Extent1].[Trial_Code] AS [Trial_Code]
        FROM [OBAR].[TrialSummary] AS [Extent1]
        WHERE [Extent1].[Trial_MasterProtocolId] IN (N'15NOPEPYT512')
    )  AS [Distinct1]

我的问题是:为什么上面的SQL语句中有两个select语句,一个inner,一个outer。

我是不是做错了什么,因为我认为这应该在这里产生错误,因为我认为这应该产生如下 SQL 语句

SELECT DISTINCT 
        [Extent1].[Trial_Code] AS [Trial_Code]
        FROM [OBAR].[TrialSummary] AS [Extent1]
        WHERE [Extent1].[Trial_MasterProtocolId] IN (N'15NOPEPYT512')

你能帮忙吗?

【问题讨论】:

    标签: c# linq linq-to-entities distinct expression-trees


    【解决方案1】:

    我的问题是:为什么有两个 select 语句,一个是内部的,一个是 上述SQL语句中的outer。

    您使用了两个distinct 命令,因此生成的sql 也将包含两个distinct。将您的 linq 更改为:

    var trials = queryableTrialSummary.Where(finalWhere).Select(x => x.Trial_Code).Distinct();
    

    您可以使用linqPad 来检查您生成的SQL。

    【讨论】:

    • @user3494319 我回答你的问题了吗?
    【解决方案2】:

    问题: 为什么有两个select语句,一个inner和一个outer 上面的 SQL 语句。

    因为您通过两次 Distinct 将两个表达式添加到表达式树中:

    queryableTrialSummary.Where(finalWhere).Distinct();
    queryableTrialSummary.Select(x => x.Trial_Code).Distinct();
    

    尝试了解 IQueryable 和 IEnumerable 的工作原理。 This is a nice blog to read.

    你要找的是:

    queryableTrialSummary.Where(finalWhere);
    queryableTrialSummary.Select(x => x.Trial_Code).Distinct();
    

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多