【问题标题】:LINQ Complex QueryLINQ 复杂查询
【发布时间】:2017-06-12 06:05:43
【问题描述】:

我有一个复杂的 SQL 查询,需要在 LINQ 中运行。我想知道是否可以使用 LINQ 来做到这一点,或者我还需要其他什么吗?请你帮助我好吗?谢谢。

SELECT DISTINCT_PLAY_COUNT,SUM(1) AS CLIENT_COUNT FROM
    (SELECT CLIENT_ID,SUM(1) AS DISTINCT_PLAY_COUNT FROM
        (SELECT CLIENT_ID,SONG_ID FROM PIEXHIBIT 
        WHERE PLAY_TS >= '10/08/2016 00:00:00' AND PLAY_TS <= '10/08/2016 23:59:59'
        GROUP BY CLIENT_ID,SONG_ID
    )
    GROUP BY CLIENT_ID
)
GROUP BY DISTINCT_PLAY_COUNT 

这是我的课程以及我到目前为止所取得的成就;

    public class Exhibit
    {
        public string PLAY_ID { get; set; }
        public Int32 SONG_ID { get; set; }
        public Int32 CLIENT_ID { get; set; }
        public DateTime PLAY_TS { get; set; }

    }

    var sql = from Exhibit row in Exhibit
                              where row.PLAY_TS >= DateTime.Parse("10/08/2016 00:00:00") && row.PLAY_TS <= DateTime.Parse("10/08/2016 23:59:59")
                              select new { row.CLIENT_ID, row.SONG_ID };

【问题讨论】:

  • 请不要只发布 SQL 并要求转换。至少显示一个类模型,以便导航属性和关联的多样性是可见的。此外,请说明您的目标是什么类型的 LINQ(针对实体?),并展示您自己的初步努力。他们向我们解释的内容比您想象的要多。
  • 感谢您的建议,我编辑了我的问题。

标签: c# sql linq


【解决方案1】:
Exhibits
   .Where(t => t.PLAY_TS >= new DateTime(2016, 8, 10) && t.PLAY_TS < new DateTime(2016, 8, 11))
   .Select(t => new { t.CLIENT_ID, t.SONG_ID })
   .Distinct()
   .GroupBy(c => c.CLIENT_ID)
   .Select(c => c.Count())
   .GroupBy(g => g)
   .Select(g => new { DISTINCT_PLAY_COUNT = g.Key, CLIENT_COUNT = g.Count() })
   .ToList();

我认为这应该可行。

【讨论】:

  • 效果很好,但我想问一些问题。 LINQ和sql的输出不一样正常吗?
  • 这个问题恐怕我没看懂。
  • 我得到了不同的输出。当我运行 SQL 时,我得到了其他东西。当我运行 LINQ 结果是不同的。请问这正常吗?
  • 可能有bug,结果应该是一样的。
  • 内存计算 (LINQ) 是否比 SQL 更好?也许是这样?
【解决方案2】:

LINQ 的区别总是有点棘手。有可能:

Select distinct using linq (我倾向于重载 equals 方法,即使这可能不是正确的方法。)

该链接有很多关于做什么的建议。 “重复答案”主题也有一些不错的建议。

我还想建议您:

  1. PLAY_TS

应该改为

  1. PLAY_TS

仅仅是因为实际上可能会遇到一个毫秒问题,您在技术上还没有更改日期,因为毫秒还没有达到 999。

我希望你明白我的意思。

【讨论】:

  • 感谢您的日期建议。我想知道是否可以选择嵌套在 LINQ 中。
  • @developerCoder 这里有一个答案(有点):stackoverflow.com/questions/9044255/…
  • 不需要对组对象使用 distinct。只取组中的第一项。
【解决方案3】:

我建议将它放在存储过程中,而不是使用 LINQ。然后通过下面的代码执行存储过程:

using (var conn = new SqlConnection(connString)) //Connection string in there
using (var command = new SqlCommand("ProcedureNameHere", conn) {
    CommandType = CommandType.StoredProcedure }) {
        conn.Open();
        command.ExecuteNonQuery();
}

【讨论】:

  • 如果我能在数据库中做这个查询就好了。我只是读取一个 csv 文件,并且在读取该 csv 时需要实现该 sql 的输出。由于我的查询太复杂,我无法将其转换为 LINQ。
【解决方案4】:

这是我的建议。 GroupBy 将自动为您提供与我的代码不同的信息。 :

            var sqlDateTime = from Exhibit row in Exhibit.exhibits
                     where row.PLAY_TS >= DateTime.Parse("10/08/2016 00:00:00") && row.PLAY_TS <= DateTime.Parse("10/08/2016 23:59:59")
                     select new { cid = row.CLIENT_ID, songid = row.SONG_ID, date = row.PLAY_TS };

            var results = sqlDateTime.GroupBy(x => new { cid = x.cid, sid = x.songid })
                .Select(x => new { count = x.Count(), cid = x.Key.cid, sid = x.Key.sid }).ToList();  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多