Gnarly Linq查询

时间:2013-04-24 02:19:33

标签: c# linq

具有以下表格结构

table structure

我需要按状态转录的计数,其中记录没有工作流文件夹。这就是诀窍:

from p in Transcriptions
where p.WorkflowfolderID == null
group p by p.TranscriptionStatus.Description into grouped
select new 
{
   xp=grouped.Key,
   xp1= grouped.Count(),
}

现在我需要添加Dueon日期过去的记录数量,因为它已超过截止日期。等等

EntityFunctions.DiffHours(p.DueOn,DateTime.Today)>0

如何在不触发2个SQL查询的情况下将其包含在结果集中?我很高兴将它作为第三列,在每一行中具有相同的值。无论如何还要将百分比纳入混合中,如:

状态|数| %|
------------------------------
Status1 | 20 | 20%
Status2 | 30 | 30%
Status3 | 30 | 30%
逾期| 20 | 20%

我已将Overdue添加为一行,但非常乐意将其作为具有相同值的列。

已修改内容

这是我能想到的最好的。它不是一个单一的查询,但只有一次SQL旅行。结果是:

状态|伯爵 ----------------
Status1 | 20
Status2 | 30
Status3 | 30个
逾期| 20

var q1= from p in Transcriptions
    where p.WorkflowfolderID == null
    group p by p.TranscriptionStatus.Description into grouped
    select new 
    {
       status= (string)grouped.Key,
       count= grouped.Count()
    };

    var q2 =(
      from p in Transcriptions select new {status = "Overdue", 
        count = (from x in Transcriptions 
        where x.DueOn.Value < DateTime.Now.AddHours(-24) 
        group x by x.TranscriptionID into 
        grouped select 1).Count() }).Distinct();
    q1.Union(q2)

这是一个Union子句,一旦返回结果就会进行%计算。奇怪的是,我无法弄清楚在LINQ语句中表示以下SQL的任何干净方式,这导致了var q2中相当混乱的LINQ。

SELECT COUNT(*) , 'test' FROM [Transcription]

2 个答案:

答案 0 :(得分:0)

您可以向Count添加条件:

from p in Transcriptions
where p.WorkflowfolderID == null
group p by p.TranscriptionStatus.Description into grouped
select new 
{
    xp=grouped.Key,
    xp1= grouped.Count(),
    xp2= grouped
         .Count(p => EntityFunctions.DiffHours(p.DueOn, DateTime.Today) > 0)
}

顺便说一句,使用实体框架,您也可以使用p.DueOn < DateTime.Today

答案 1 :(得分:0)

@Gert Arnold

  from p in Transcriptions
        where p.WorkflowfolderID == null
        group p by p.TranscriptionStatus.Description into grouped
        select new 
        {

        status= (string)grouped.Key,
        count= grouped.Count(),
           overdue= grouped.Count(p => p.DueOn < EntityFunctions.AddHours(DateTime.Today, -24)),


        }

上面的查询确实可以正常工作。它以

格式生成结果

状态|数|逾期
----------------------
状态1 | 2 | 0
STATUS2 | 1 | 1

唯一的缺点是生成的SQL正在运行带有内连接的2个查询。我对联盟的最初想法可能是一个更好的想法表现明智,但你回答了我的疑问,为此我很感激。

此查询可以用比上述尝试更清洁的方式表示 -

SELECT COUNT(*) , 'test' FROM [Transcription]