C# Linq-其中包括
我知道这不会像写的那样起作用,但我正在努力寻找正确的答案,这段非功能性代码有望说明我要实现的目标:C# Linq-其中包括,c#,sql,linq,C#,Sql,Linq,我知道这不会像写的那样起作用,但我正在努力寻找正确的答案,这段非功能性代码有望说明我要实现的目标: var defaults = _cilQueryContext.DefaultCharges .Where(dc => dc.ChargingSchedule_RowId == cs.RowId); List<DevelopmentType> devTypes = defaults.Select(dc => dc.
var defaults = _cilQueryContext.DefaultCharges
.Where(dc => dc.ChargingSchedule_RowId == cs.RowId);
List<DevelopmentType> devTypes =
defaults.Select(dc => dc.DevelopmentType)
.Include(d => d.DefaultCharges)
.Include(d => d.OverrideCharges.Where(oc => oc.ChargingSchedule_RowId == cs.RowId))
.Include(d => d.OverrideCharges.Select(o => o.Zone))
.ToList();
var defaults=\u cilQueryContext.DefaultCharges
其中(dc=>dc.ChargingSchedule_RowId==cs.RowId);
列表devTypes=
defaults.Select(dc=>dc.DevelopmentType)
.包括(d=>d.DefaultCharges)
.Include(d=>d.OverrideCharges.Where(oc=>oc.ChargingSchedule_RowId==cs.RowId))
.Include(d=>d.OverrideCharges.Select(o=>o.Zone))
.ToList();
本质上,我假设这需要一个联接,但由于我试图选择一个包含两个相关类型的子对象的父对象,我看不出联接的“select new”子句中会有什么内容。据我所知
Include
不支持这种类型的子查询。你最好的选择是使用投影
List<DevelopmentType> devTypes =
defaults.Include(x => x.DefaultCharges)
.Include(x => x.OverrideCharges)
.Select(x => new {
DevType = x.DevelopmentType,
Zones = x.OverrideCharges.Where(oc => oc.ChargingSchedule_RowId == cs.RowId)
.Select(oc => oc.Zone).ToList()
})
.Select(x => x.DevType)
.ToList();
List devTypes=
默认值。包括(x=>x.DefaultCharges)
.包括(x=>x.OverrideCharges)
.选择(x=>new{
DevType=x.DevelopmentType,
Zones=x.OverrideCharges.Where(oc=>oc.ChargingSchedule_RowId==cs.RowId)
.Select(oc=>oc.Zone).ToList()
})
.Select(x=>x.DevType)
.ToList();
我真的希望包含的可以这样工作,但看起来不行,所有包含的数据都将不经过任何预过滤就包含在内:(EntityFramework不支持这一点。您需要使用联接,然后使用投影,而不是includes来实现此结果。谢谢各位,但正如前面所述,我知道它不会像编写的那样工作,需要联接。我只需要一些关于联接的正确语法的帮助。您的意思肯定是返回tmp而不是返回dev?谢谢您的帮助。我很高兴。)不管我用哪种方式叠加语法,我似乎都会遇到两个错误中的一个。如果我尝试以与建议类似的方式使用“select”,我将无法将IQueryable转换为ICollection类型错误。如果我使用ToList()(使其成为ICollection),或者尝试使用Add()将项添加到ICollection,我会被告知“带有语句体的lambda表达式无法转换为表达式树”。很抱歉,继续依赖您的大脑,但我正在努力解决这个问题。@mattshower What@James post将不适用于EF(和其他提供程序),因为select body不是表达式(因此无法解析为SQL)。如果您将ToList()
在选择之前,它应该可以工作,但这会从数据库中带回不必要的覆盖Charges
。您仍然可以通过选择一个匿名类型来重新执行此操作,该匿名类型同时包含开发类型
和一个过滤的覆盖Charges
属性,然后在内存中合并它们。@mattshower see更新。我试图避免创建一个新实例,但是,我不知道这在EF中不起作用。更详细地查看查询,尽管给出的结果只是希望返回开发类型,但我想知道为什么您需要在这里进行区域选择?