将T-SQL查询转换为C#LINQ,在多个条件下加入,并在多个条件下进行分组

时间:2014-04-10 11:05:31

标签: c# sql linq

首先,我想打个招呼,我是这个网站的新手; - )

我的问题是将以下sql-query转换为c# linq-query

(我一直在努力寻找现有的答案,但我无法将解决方案结合起来 加入多个条件和分组/计数! )

sql-query:

DECLARE @datestart AS DATETIME
DECLARE @dateend AS DATETIME

SET @datestart = '01.04.2014'
SET @dateend = '30.04.2014'

SELECT md1.value AS [controller],md2.value AS [action], COUNT(md2.value) AS   [accesscount], MAX(re.TIMESTAMP) AS [lastaccess] FROM recorderentries AS re
INNER JOIN messagedataentries AS md1 ON re.ID = md1.recorderentry_id AND md1.position =  0
INNER JOIN messagedataentries AS md2 ON re.ID = md2.recorderentry_id AND md2.position = 1
WHERE re.TIMESTAMP >= @datestart AND re.TIMESTAMP <= @dateend 
AND re.messageid IN ('ID-01','ID-02' )
GROUP BY md1.value,md2.value
ORDER BY [accesscount] DESC 

欢迎任何建议......

到目前为止我所拥有的是:

var _RecorderActionCalls = (from r in _DBContext.RecorderEntries
                                    join m1 in _DBContext.MessageDataEntries on
                                     new {
                                        a = r.ID,
                                        b = 0
                                     } equals new {
                                        a = m1.ID,
                                        b = m1.Position
                                     }
                                    join m2 in _DBContext.MessageDataEntries on
                                                       new {
                                                          a = r.ID,
                                                          b = 0
                                                       } equals new {
                                                          a = m2.ID,
                                                          b = m2.Position
                                                       }
                                    where r.TimeStamp >= StartDate & r.TimeStamp <=     EndDate & (r.MessageID == "VAREC_100_01" | r.MessageID == "VAAUTH-100.01")
                                    group r by new { md1 = m1.Value, md2 = m2.Value }    into r1
                                    select new { controller = r1.Key.md1, action =    r1.Key.md2, count = r1.Key.md2.Count() }).ToList();

但这引发了一个例外(翻译自德语):

DbExpressionBinding需要一个带有列表结果类型...

的输入表达式

更新:回到头痛......; - )

我找到了解决问题的方法:

var _RecorderActionCalls = _DBContext.RecorderEntries
                                 .Where(r => r.TimeStamp >= StartDate & r.TimeStamp <=     EndDate & (r.MessageID == "VAREC_100_01" | r.MessageID == "VAAUTH-100.01"))
                                 .GroupBy(g => new { key1 =    g.MessageData.FirstOrDefault(md1 => md1.Position == 0).Value, key2 = g.MessageData.FirstOrDefault(md2 => md2.Position == 1).Value })
                                 .Select(s => new {
                                    ControllerAction = s.Key.key1 + " - " + s.Key.key2,
                                    Value = s.Count(),
                                    Last = s.Max(d => d.TimeStamp)
                                 }).ToList();

使用这种语法对我有用。谢谢你为我思考: - )

1 个答案:

答案 0 :(得分:0)

类似的东西:

List<string> messageIdList = new List<string> { "ID-01", "ID-02" };

from re in RecorderEntries
from md1 in MessageDataEntries
from md2 in MessageDataEntries
where re.ID = md1.recorderEntry_id && md1.position == 0
where re.ID = md2.recorderEntry_id && md2.position == 1
where idList.Contains(re.messageid)
let joined = new { re, md1, md2 }
group joined by new { controller = joined.md1.value, action = joined.md2.value } into     grouped
select new { 
    controller = grouped.Key.controller, 
    action = grouped.Key.action,     
    accesscount = grouped.Where(x => x.md2.value != null).Count(), 
    lastaccess = grouped.Max(x => x.re.TimeStamp) }