我试图做一个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。
答案 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
});