2017-06-11 194 views
0

我有一个复杂的SQL查询,我需要在LINQ中运行。我想知道是否可以用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 }; 
+1

请不要只发布SQL并要求转换。至少显示一个类模型,以便导航属性和关联的多样性是可见的。另外,请告诉你的目标(对实体?)什么类型的LINQ,并展示你自己的第一个努力。他们向我们澄清的比你想象的更多。 –

+0

感谢您的建议,我编辑了我的问题。 – developerCoder

回答

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(); 

我认为这应该工作。

+0

它很好用,但我想问一些问题。 LINQ和sql的输出是不同的吗? – developerCoder

+0

恐怕我不明白这个问题。 –

+0

我得到了不同的输出。当我运行SQL时,我得到了别的东西。当我运行LINQ的结果是不同的。我问,如果这是正常的? – developerCoder

0

区别对于LINQ来说总是有点棘手。这是可能的:

Select distinct using linq (我偏重载equals方法,尽管这可能不是要走的正确方法。)

链接有建议,良好的负荷至于什么做。 “重复答案”线程也有一些很好的建议。

我还想建议您:

  1. PLAY_TS < = 'DD/MM/YYYY 23:59:59'

应改为

  1. PLAY_TS <'DD + 1/MM/YYYY 00:00:00'

简单地说,因为在技术上没有改变日期的情况下,实际上可能会遇到毫秒问题,因为毫秒还没有达到999。

我希望你明白我的意思。

+0

感谢您的日期建议。我想知道是否可以选择嵌套在LINQ中。 – developerCoder

+1

@developerCoder 它有一个答案(有点)在这里: https://stackoverflow.com/questions/9044255/linq-query-with-three-nested-levels –

+0

没有必要使用不同的组对象。只需拿第一组。 – jdweng

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(); 
} 
+0

这将是很好,如果我可以在数据库中执行此查询。我只是读取一个csv文件,并且需要在读取该csv时实现该sql的输出。由于我的查询太复杂,我无法将其转换为LINQ。 – developerCoder

-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();