使用LINQ to SQL获取IQueryable结果集的不同值

时间:2012-04-30 12:45:00

标签: c# asp.net linq linq-to-sql

我正在使用LINQ to SQL(通过DBML)我需要限制并且我遇到了问题。我正在使用动态LINQ并发送由最终用户先前确定的变量。我在db中有一个VIEW,它保存(通过左外连接)来自主db表的数据和连接它的5个表。因为我(并且必须)使用动态LINQ,所以BD的结果集必须是.AsQueryable(),因此创建了一个IQueryable结果集。以下是它正在做的一个例子:

让我们说该视图包含汽车信息(制作,模型,年份,颜色,Milage,服务记录)。 如果用户想要查看今年已经提供服务的所有福特野马,那么结果集将会返回

[uniqueID - 1][Ford][Mustang][1/1/2012](service date)
[uniqueID - 1][Ford][Mustang][2/1/2012](service date)
[uniqueID - 1][Ford][Mustang][3/1/2012](service date)
[uniqueID - 1][Ford][Mustang][4/1/2012](service date)

哪个好,我们假设这个特殊的野马今年已经完成了4项服务。

然而,如果用户只是看到所有黑色FORD,那么它就会回来

[uniqueID - 1][Ford][Mustang]
[uniqueID - 1][Ford][Mustang]
[uniqueID - 1][Ford][Mustang]
[uniqueID - 1][Ford][Mustang]
[uniqueID - 2][Ford][Taurus]

它为每个服务返回一行,即使该服务为null并且返回的IQueryable具有.Distinct()。

return data.Distinct().OrderBy(strOrderBy).Select("New(" + strItems + ")");

我需要做的是获取IQueryable并从中获取不同的值,因为进来的变量是动态的,我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

您使用的是哪个ORM? 不同的ORM具有不同的行为,特别是如果ORM不在它发送给DB的sql中发送“distinct”调用。

在运行该行之前,您的“数据”变量是否已解决? 如果是这样,你在Linq对象上做的不同,而不是Linq to SQL

从您的示例中,最直接的事情是使用第二个Distinct重载为您的查询实现IEqualityComparer。它看起来像这样:

return data.Distinct(new YourEqualityComparer()).OrderBy(strOrderBy).Select("New(" + strItems + ")");

请注意,如果您希望在服务器端完成订购,则必须在不同之前推送OrderBy调用。

以下是与此主题相关的一些有用链接:

http://msdn.microsoft.com/en-us/library/ms132151.aspx http://blog.lavablast.com/post/2010/05/05/Lambda-IEqualityComparer3cT3e.aspx http://www.codeproject.com/Articles/94272/A-Generic-IEqualityComparer-for-Linq-Distinct

答案 1 :(得分:1)

我怀疑.Distinct()正在对整行数据执行,因为它们都有不同的服务日期,所以没有重复,所以.Distinct()不会消除。

您可以尝试将方法的顺序更改为:

return data.OrderBy(strOrderBy).Select("New(" + strItems + ")").Distinct();