LINQ复杂查询

时间:2017-06-11 20:13:00

标签: c# sql linq

我有一个复杂的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 };

4 个答案:

答案 0 :(得分: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();

我认为这应该有用。

答案 1 :(得分:0)

对于LINQ,

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

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

这个链接有很多关于做什么的建议。 “重复回答”帖子也有一些不错的建议。

我还想建议您:

  1. PLAY_TS&lt; ='DD / MM / YYYY 23:59:59'
  2. 应改为

    1. PLAY_TS&lt; 'DD + 1 / MM / YYYY 00:00:00'
    2. 仅仅因为实际上可能遇到一个技术上没有改变日期的毫秒问题,因为毫秒还未达到999。

      我希望你理解我的意思。

答案 2 :(得分:0)

我建议将它放在存储过程中而不是使用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();
}

答案 3 :(得分:-1)

这是我的建议。 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();