0

我正在使用需要限制的 LINQ to SQL(通过 DBML)并且遇到了问题。我正在使用动态 LINQ 并发送最终用户先前确定的变量。我在数据库中有一个视图,它保存(通过左外连接)来自主数据库表和连接到它的 5 个表的数据。因为我正在(并且必须)使用动态 LINQ,所以来自 BD 的结果集必须是 .AsQueryable() 从而创建一个 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 具有 .Distinct()。

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

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

4

2 回答 2

1

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

在运行该行之前,您的“数据”变量是否已解析?如果是这样,您正在对 Linq to Objects 进行 Distinct,而不是 Linq to SQL

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

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

请注意,如果您希望在服务器端完成订购,则必须在 distinct 之前推送 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

于 2012-04-30T12:54:53.667 回答
1

我怀疑这.Distinct()是对整行数据执行的,并且由于它们都有不同的服务日期,因此没有重复,因此不会被.Distinct().

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

return data.OrderBy(strOrderBy).Select("New(" + strItems + ")").Distinct();
于 2012-04-30T13:30:32.223 回答