Linq:
var data = groups
.SelectMany(g => g.Warnings.Select(w => new { g.Category, Warnings = w }))
.Where(d => d.Warnings.Type == "Drug to Drug Interaction")
.Select(s => new Group(
Category.GetFromTitle(s.Category.Title),
s.Warnings.ToEnumerable().ToReadOnlyCollection())
);
我有一个LINQ查询,提供如下的结果
实际输出:
标题1 | 标题2 | Category1 | Warning1 |
---|---|
Category1 | Warning2 |
Category2 | Warning3 |
Category2 | Warning4 |
试着重构你的代码,
var data = groups
.Select(g => new Group(
Category.GetFromTitle(g.Category.Title),
g.Warnings
.Where(WhereIsWarningType)
.SelectMany(SelectWarningToEnumerable).ToReadOnlyCollection()))
.Where(WhereGroupHasWarnings)
.ToList();
bool WhereIsWarningType(Common.Warnings.Mkb.Warning w) =>
w.Type.Equals("Drug to Drug Interaction");
IEnumerable<Common.Warnings.Mkb.Warning> SelectWarningToEnumerable(Common.Warnings.Mkb.Warning w) =>
w.ToEnumerable();
bool WhereGroupHasWarnings(Group g) => g.Warnings.Any();
我相信下面的LINQ查询一定会帮助您通过结果集找到您想要的预期组。
var categoryWiseWarningList = (from cw in db.CategoryWarnings
join w in db.Warnings
on cw.warningId equals w.warningId
join c in db.Categories
on cw.categoryId equals c.categoryId
select new CategoryWarningViewModel
{
Category= c,
Warning = w
});