C# LINQ-Lambda改进
我有这样一句话:C# LINQ-Lambda改进,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,我有这样一句话: var lstOfIds = db.TBL_AssocIncidentSpecialCat .Where(x => x.IncidentId == incidentVm.ID) .Select(t => t.SpecialCategoriesId) .ToList(); 这一行为我收集了SpecialCategoriesIds的列表。那么我必须这样做: incident
var lstOfIds = db.TBL_AssocIncidentSpecialCat
.Where(x => x.IncidentId == incidentVm.ID)
.Select(t => t.SpecialCategoriesId)
.ToList();
这一行为我收集了SpecialCategoriesId
s的列表。那么我必须这样做:
incidentVm.LstSpecialCategories = db.TBL_SpecialCategories
.Where(x => lstOfIds.Contains(x.Id))
.Select(t => t.SpecialCategory)
.ToList();
有没有办法把这两条线合并成一条?即使只有两行代码。。我觉得先抓取Id,然后根据Id抓取相关属性只是额外的一步,可以缩短为一行。但我可能错了
感谢您的帮助
更新
incidentVm.LstSpecialCategories = db.TBL_AssocIncidentSpecialCat
.Where(x => x.IncidentId == incidentVm.ID)
.Join(
db.TBL_SpecialCategories,
x => new{Id = x.SpecialCategoriesId},
t => new{Id = t.Id},
(x,t) => {return t.SpecialCategory}
);
我在Join
中的最后一部分下面变红了:
具有语句体的lambda表达式无法转换为表达式树
您可以使用
Join
组合这两行。大概
var result = db.TBL_AssocIncidentSpecialCat
.Join(
db.TBL_SpecialCategories,
ais => new { Id = ais.IncidentId },
sc => new { Id = sc.Id },
(ais, sc) => { return sc; }
)
.ToList();
为了这个
使用Where子句更新:您应该在加入
之后使用Where
条件
var result = db.TBL_AssocIncidentSpecialCat
.Join(
db.TBL_SpecialCategories,
ais => new { Id = ais.IncidentId },
sc => new { Id = sc.Id },
(ais, sc) => new { ais = ais, sc = sc }
)
.Where(x => x.ais.IncidentId == 1)
.Select(y => y.sc)
.ToList();
您可以尝试LINQ查询样式的联接:
incidentVm.LstSpecialCategories = (from aispc in db.TBL_AssocIncidentSpecialCat
join spc in db.TBL_SpecialCategories
on aispc.SpecialCategoriesId equals lspc.Id
where aispc.IncidentId == incidentVm.ID
select lspc.SpecialCategory).ToList();
在一些答案的帮助下,我能够弄明白这一点,并且我自己进行了测试。以下是我的解决方案:
incidentVm.LstSpecialCategories = db.TBL_AssocIncidentSpecialCat
.Where(t => t.IncidentId == incidentVm.ID)
.Join(db.TBL_SpecialCategories,
ik => ik.SpecialCategoriesId,
ok => ok.Id,
(ik, ok) => ok.SpecialCategory
)
.ToList();
感谢您的帮助。这是实体框架。对不起,我会添加到标签中。这些类型是Entity FrameworkSee中的域类型,关于如何使用EFI进行连接,您可以始终使用id为的
join()
。@Kwinten无论如何,您可以提供一个示例。我目前正在做这件事well@mjwills好的,现在我在Join
下面看到了红色的蠕动。。无法从用法推断类型参数。尝试指定类型参数explicitly@M12Bennett我已经更新了答案。Where
子句应位于Join
之后。