我正在使用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并从中获取不同的值,因为进来的变量是动态的,我不知道该怎么做。
答案 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();