2012-04-30 57 views
0

我正在使用LINQ to SQL(通过DBML),我需要限制并且存在问题。我正在使用动态LINQ并发送由最终用户以前确定的变量。我有一个在数据库中的视图(通过左外连接)主数据库表中的数据和5个表连接到它。因为我(而且必须)使用动态LINQ,所以BD的结果集必须是.AsQueryable(),从而创建一个IQueryable结果集。下面是它正在做什么的一个例子:使用LINQ to SQL获取IQueryable结果集的不同值

可以说,该视图可以保存汽车信息(品牌,型号,年份,颜色,米拉格,服务记录)。 如果用户将在他们希望看到的是,今年已提供服务的所有福特野马,结果集中会回来这样

[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个服务今年完成。

但是,如果用户将在刚刚看到全黑色的福特那么它回来

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

它返回行的每一个服务,即使该服务会为空,则返回拥有的IQueryable a .Distinct()。

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

我需要能够做的,是采取的IQueryable并从中获得不同的值,因为在未来的变量是动态的,我不知道如何做到这一点。

+0

为什么会有4个服务行是空?这些行不应该不存在于服务表中吗? – omatase

+0

@omatase问题在于服务存在,但是当我想要提取不涉及服务的数据时,我无法获取不同的值,因为该视图看到服务,因此它不是独特的。 – EvanGWatkins

回答

1

您使用的是哪个ORM? 不同的ORM具有不同的行为,特别是如果ORM在发送到数据库的SQL中不发送“独特”调用。

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

在你的例子中,最直接的做法是实现一个IEqualityComparer你的查询与第二个不同的重载。它会是这个样子:

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

待办事项,如果你希望你的订单做服务器端,你将不得不推前不同的排序依据通话。

下面是与该主题相关的一些有用的链接:

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

+0

我在DBML上使用LINQ to SQL作为类模型(多数民众赞成我最好的方式来描述它) – EvanGWatkins

+0

这是你建立的一个自定义的东西?无论如何,您要查找的是一个IEqualityComparer,因此您可以在选择前比较每列的平等性。 –

1

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

你可以尝试改变的方法为:

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