我试图使用Distinct()与一些iqueryable下面的代码:
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语句,一个是内部语句,另一个是外部语句。
我做错了什么,因为我认为这会产生错误,因为我认为这应该产生如下的SQL语句
SELECT DISTINCT
[Extent1].[Trial_Code] AS [Trial_Code]
FROM [OBAR].[TrialSummary] AS [Extent1]
WHERE [Extent1].[Trial_MasterProtocolId] IN (N'15NOPEPYT512')
能否请你帮忙。
我的问题是:为什么在上面的SQL语句中有两个select语句,一个是内部语句,另一个是外部语句。
您使用了两个distinct
命令,因此生成的sql也将包含两个distinct
。将您的linq更改为:
var trials = queryableTrialSummary.Where(finalWhere).Select(x => x.Trial_Code).Distinct();
您可以使用linqPad检查生成的SQL。
问题:为什么在上面的SQL语句中有两个select语句,一个是内部语句,另一个是外部语句。
因为您通过两次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();