如何写下面的查询在LINQ

问题描述:

我有一个SQL查询,并想将其转换成LINQ如何写下面的查询在LINQ

SELECT CAST([Date] AS DATE), 
COUNT([ID]) AS 'Amount of Systems' 
FROM [DemoDB].[dbo].[Servers] 
WHERE [ServerID] IN ('ServerX') AND [Type] = 'Complete' 
GROUP BY CAST([Date] AS DATE) 
ORDER BY CAST([Date] AS DATE) 

这将返回的结果如下

enter image description here

我有什么试图

//fromDP and toDP are the names of the Datepicker's 
var query = (this.db.Servers 
        .Where(x => x.Date >= fromDP.SelectedDate.Value && 
        x.Date <= toDP.SelectedDate.Value)); 


var query_Success = query.Count(p => p.Type == "Complete" 
        && (p.ServerID == "ServerX"));  

和我的结果总体上为计数(例如i f我从4月1日至4月15日选择,结果是所有“完整”的总和),但我需要在此选定范围内的每一天进行计数。结果我将绑定到柱状图。 如何继续?

+0

你试过了......问题是什么? – 2013-05-03 10:09:23

+0

对不起,我会将其添加到我的问题 – user1221765 2013-05-03 10:09:45

+0

为什么你需要施放日期?它不是数据库上的Date或Datetime类型吗? – 2013-05-03 10:09:56

如果我理解正确笔者希望只使用日期没有时间。要使用EF来做到这一点,我们可以使用方法EntityFunctions.TruncateTime来调整时间部分。我会建立@steaks回答:

db.Servers.Where(s => s.ServerId == "ServerX" && s.Type == "Complete") 
      .GroupBy(s => EntityFunctions.TruncateTime(s.Date)) 
      .OrderBy(s => s.Key) 
      .Select(g => new {Date = g.Key, AmountOfSystems = g.Count()}); 
+0

@ ws0205感谢您的更新。但我只是想要有不同的日期值作为回报。 – user1221765 2013-05-03 12:34:34

+0

wokrs fine atlast,谢谢:) – user1221765 2013-05-03 13:48:34

this.db.Servers.Where(s => s.ServerId == "ServerX" && s.Type == "Complete") 
     .GroupBy(s => s.Date) 
     .OrderBy(s => s.Key) 
     .Select(g => new { Date = g.Key, AmountOfSystems = g.Count() }); 

更改Where子句来读取

Where(s => s.ServerId == "ServerX" && s.Type == "Complete" && s.Date >= fromDP.SelectedDate.Value && s.Date <= toDP.SelectedDate.Value) 

过滤在有限的时间范围。

编辑

建议使用@vvs0205。使用EntityFunctions类操纵日期列,请你:http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx

+0

感谢您的更新@steaks,但这个查询返回一个LIST?如何将此列表绑定到我的图表值? – user1221765 2013-05-03 12:33:41

像这样的事情

var fromDate = fromDP.SelectedDate.Value; 
var toDate= toDP.SelectedDate.Value; 

var q = from server in this.db.Servers 
       where (server.Date >= fromDate && server.Date<=toDate && server.ServerID="ServerX" && server.Type=="Complete") 
       group server by server.Date 
       into g 
       orderby g.Key 
       select new 
        { 
         Date = g.Key, 
         Count = g.Count() 
        }; 

var results = q.ToList();