【问题标题】:LINQ .Take() after .Distinct() issue.Distinct() 问题后的 LINQ .Take()
【发布时间】:2016-06-24 20:27:02
【问题描述】:

所以我正在使用 LINQ 和这个(经过清理的)代码进行数据库查询:

var dateList =
            Table1.Where(t1 => t1.column1.Contains(stringUsed)) //stringUsed is a parameter of the method containing this code
                .Join(Table2, t1 => t1.columnName2, t2 => t2.columnName2,
                    (t1, t2) => new {t1, t2})
                .Join(Table3, t1t2 => t1t2.t1.column3, t3 => t3.column3,
                    (t1t2, t3) => new {Date = t3.column4})
                .Select(d => d.Date.Value) //Dates are stored as a DateTime? and I need to convert it to DateTime here
                .Distinct()
                .ToList();

最终结果是一个包含 2000 多个唯一日期的列表(一切都很好)。根据用户的要求,我只需要收集查询将创建的最新 90 条记录的日期(数据已经在数据库中排序,所以这里不需要这样做)。

当我尝试在.Distinct().ToList() 之间插入.Take(90) 时,我的问题就出现了。结果是一个只有 13 条记录的列表。我在这里和其他地方搜索,看看是否有其他人遇到过这个问题,但找不到任何东西。有什么想法吗?

【问题讨论】:

  • 什么是Table1?你在使用实体框架吗?如果有,是哪个数据库提供商?
  • 是的,使用实体框架。 Table1 是我的 Oracle 数据库中的一个表。清理了代码,但试图让发生的事情保持明显......我猜我失败了。
  • 你能不能连接一个调试器,得到.Distinct().Take(90).ToString()的值?那应该生成一个包含生成的 sql 查询的字符串。如果您可以将其添加到问题中,那将有所帮助。
  • .Distinct().Take(90) 呢?
  • @recursive 当我调试时,当我在.Distinct().ToList() 之间添加.Take(90) 时,dataList 显示计数为 13。如果不添加.Take(90)dataList 显示的计数大约为 2000。

标签: c# linq distinct take


【解决方案1】:

向@usr 提供帮助以帮助解决此问题。下面是根据需要提取 90 条记录的代码:

var dateList =
            Table1.Where(t1 => t1.column1.Contains(stringUsed)) //stringUsed is a parameter of the method containing this code
                .Join(Table2, t1 => t1.columnName2, t2 => t2.columnName2,
                    (t1, t2) => new {t1, t2})
                .Join(Table3, t1t2 => t1t2.t1.column3, t3 => t3.column3,
                    (t1t2, t3) => new {Date = t3.column4})
                .Select(d => d.Date.Value) //Dates are stored as a DateTime? and I need to convert it to DateTime here
                .Distinct()
                .OrderByDescending(d => d)
                .Take(90)
                .ToList();

显然添加.OrderBy() 是需要做的。谢谢大家。

【讨论】:

  • 您能比较一下 SQL 查询,看看发生了什么吗?这不应该是必要的。看起来如果它首先取 90,然后在那里进行区分,只留下 13 个元素,但这将是 EF 中的一个严重错误。
  • @Andrew 我不是,我在原始帖子的评论中发布了错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多