Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq-其中包括_C#_Sql_Linq - Fatal编程技术网

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中不起作用。更详细地查看查询,尽管给出的结果只是希望返回开发类型,但我想知道为什么您需要在这里进行区域选择?