清洁看起来在linq做案件的方式

时间:2014-02-20 18:43:51

标签: c# linq

我试图做一个linq声明,有3个案例。我拥有它的方式似乎超级丑陋,我希望有人会透露更清洁的方式来做到这一点。它的丑陋所以我要把它分成几部分

为了解释这一点,我加入这两个表来执行左连接

 from ccc in cDataContext.CategoryCountryCategoryTypeMappings                        
 join cl in currentLogs 
 on ccc.CategoryCountryCategoryTypeMappingID equals 
 cl.CategoryCountryCategoryTypeMappingID into final

然后我按照storefrontID

筛选出结果
 where f.CategoryCountryCategoryTypeMapping.Category.StorefrontID == StorefrontID 

然后我再分组

 group f by new {f.CategoryCountryCategoryTypeMapping.Category.CategoryID} into t1
 orderby t1.Key.CategoryID

最后,我尝试将结果输出到结构中,但请查看状态

select new 
CategoryStruct { 
    CategoryName =t1.Max(x=>x.CategoryCountryCategoryTypeMapping.Category.Name) , 
    Status = t1.Any(n=>n.Response==null)?99:t1.Any(n=>n.Response==0)?0:-1, 
             AverageResponseTime = (int)t1.Average(x => x.CaptureTime), 
    categoryId = t1.Key.CategoryID 
});

我使用terator操作员,看起来很糟糕。我试图说如果响应为空(因为连接)让状态为0,否则如果响应为0,则让状态为0,否则让状态为-1。我不认为放一个if声明会让它看起来更好。性能也是一个问题,在执行分组后,将会有大约50k行,但只有大约20个categoryStructs。

2 个答案:

答案 0 :(得分:2)

您可以在let之前添加两个select变量,并在三元运算符中使用这些变量,从而使其更加清晰。像这样:

...
let anyNullResponses = t1.Any(n=>n.Response==null)
let anyZeroResponses = t1.Any(n=>n.Response==0)
select new {
...
   Status = anyNullResponses ? 99 :
            anyZeroResponses  ? 0 : -1, 
...
}

答案 1 :(得分:1)

我不认为你可以做很多事情,除了稍微调整间距以使其更容易阅读。这是一个如何做到这一点的例子。

select new 
CategoryStruct { 
    CategoryName =t1.Max(x=>x.CategoryCountryCategoryTypeMapping.Category.Name) , 
    Status = t1.Any(n=>n.Response==null) ? 99 :
             t1.Any(n=>n.Response==0) ? 0 : 
             -1, 
    AverageResponseTime = (int)t1.Average(x => x.CaptureTime), 
    categoryId = t1.Key.CategoryID 
});