Linq Distinct SQL Statementet

Linq Distinct SQL Statementet

我尝试将 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();

但我发现 SQL Statement Generated for the distinct is as below;

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语句,一个内部和一个外部。

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

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

你能帮忙吗

My Question is: why there are two select statements, one inner and one outer in the above SQL statement.

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

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

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

Question: why there are two select statements, one inner and one outer in the above SQL statement.

因为您通过执行两次 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();