【问题标题】:linq query Take() takes precedence over Distinct()?linq 查询 Take() 优先于 Distinct()?
【发布时间】:2015-09-02 17:54:41
【问题描述】:

我必须使用 LINQ 选择不同的 1000 条记录。但是当我看到生成的查询需要 1000 条记录并在该结果上应用不同时。

IQueryable<TestClass> resultSet = (from w in ......).Distinct().Take(1000);

我的 TestClass 会是什么样子,

public TestClass
{
public string TestPRop { get; set; }
 //..has some 20 properties
}

有什么方法可以解决这个问题以将 distinct 应用于结果集,然后从不同的结果集中取 1000?

【问题讨论】:

  • 您是否尝试添加Skip(0)?也许这会创建一个“offset fetch next”查询而不是前 n 个。
  • 您是否尝试过使用组运算符而不是 distinct 来查看这是否会影响操作顺序?
  • 尝试var subquery = (from w in ...).Distinct();,然后尝试result = (from s in subquery where 1==1 select s).Take(1000);。看看这是否会迫使 distinct 成为子查询的一部分。
  • 看看 jon skeet 的回答stackoverflow.com/a/1011014/1876572
  • resultSet.ToString() 并将结果粘贴为您的问题的编辑。这将向我们展示它正在生成什么查询。

标签: c# linq


【解决方案1】:

将在拍摄前处理不同的内容。仔细检查您的 Distinct 是否正确执行。这是一个工作示例:

var dataset = new int[]
{
    1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10
};

var query = from o in dataset select o;
var result = query.Distinct().Take(6);

// result = `1,2,3,4,5,6`

我怀疑您的问题是在 SQL 中使用 distinct。如果是这样的话,你也可以使用分组来得到你想要的结果。

var distinctById = from o in query
                   group o by o.Id into uniqueIds
                   select uniqueIds.FirstOrDefault();

【讨论】:

  • 这是有效的,因为你有一个 int 列表。当你有一个 T 列表时它不会工作(T 是一个类)。
  • @Arvind897 当T 是一个类时它肯定会起作用。
  • @JonHanna nopes ..它的作用是它需要 1000 条记录,然后对此进行区分..当您向数据库查询时。
  • “当你有一个 T 列表时它不会工作(T 是一个类)”当你有一个 T 列表时,不会查询任何数据库。
  • 问题可能是在 SQL 中使用 Distinct。如果是这种情况,您可以使用“组”。我已经更新了我的示例。
【解决方案2】:

即使您在 Take() 之前执行 distinct(),您也只获取 1000 条记录,然后使用您的代码对这 1000 条记录应用不同。

实现这一点的最佳方法是直接从 SQL 查询而不是从代码 I.E 中获取 1000 条不同的记录

string queryString = "SELECT top 1000 from (select distinct ... from table)";

【讨论】:

  • You are only taking 1000 records and then applying distinct over those 1000 records - 你的依据是什么?这不是我阅读问题的方式。
  • Kirk,我这篇文章的重点是使用sql查询来获取数据
【解决方案3】:

您可以使用嵌套的 linq 查询

IQueryable<TestClass> resultSet = from x in ((from w in ......).Distinct()).Take(1000);

【讨论】:

  • 这不会以任何方式更改生成的查询。这将在到达查询提供程序之前编译成相同的表达式树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多