Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 无法在EF中排序子对象_C#_Linq_Entity Framework - Fatal编程技术网

C# 无法在EF中排序子对象

C# 无法在EF中排序子对象,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个linq查询,在针对内存中的数据执行时可以正常工作,但在使用EF时不能正常工作 首先,这里是我的查询说明,我已将查询更改为仅对单个值justOneDcn而不是整个context.RepairDocuments进行操作,以便生成的SQL更易于读取: var justOneDcn=context.RepairDocuments.Whered=>d.Dcn=00001; var q=来自justOneDcn中的dcn 让orderedHistory=dcn.History.OrderByh=>

我有一个linq查询,在针对内存中的数据执行时可以正常工作,但在使用EF时不能正常工作

首先,这里是我的查询说明,我已将查询更改为仅对单个值justOneDcn而不是整个context.RepairDocuments进行操作,以便生成的SQL更易于读取:

var justOneDcn=context.RepairDocuments.Whered=>d.Dcn=00001; var q=来自justOneDcn中的dcn 让orderedHistory=dcn.History.OrderByh=>h.Date 让xdaHistoryPoint=orderedHistory.FirstOrDefaulth=>h.Status==DocumentStatus.Xda 选择故事点; 我删除了不必要的额外代码。问题是EF正在生成以下SQL:

选择 […col list…] 当[Element1].[id]不为空时,则[Element1].[date]ELSE@p__linq__0结束为[C2] 从中选择[Extent1].[id]作为[id] 从[dbo].[repair_document]开始,作为[Extent1] 其中N'00001'=[Extent1].[dcn]作为[Filter1] 外部应用选择顶部1 […col list…] 从[dbo]。[repair_document_history]作为[Extent2] 其中[Filter1].[id]=[Extent2].[repair_document_id]和4=将[Extent2].[status]转换为int,将[Extent2].[status]转换为int作为[Element1]不为NULL -p__linq__0:'1/1/0001 12:00:00 AM'类型=日期时间2 但是上面的SQL返回了错误的数据,它应该在where子句之后添加ORDER BY[Extent2].date。以下修改后的SQL为我提供了正确的结果:

选择 […col list…] 当[Element1].[id]不为空时,则[Element1].[date]ELSE@p__linq__0结束为[C2] 从中选择[Extent1].[id]作为[id] 从[dbo].[repair_document]开始,作为[Extent1] 其中N'00001'=[Extent1].[dcn]作为[Filter1] 外部应用选择顶部1 […col list…] 从[dbo]。[repair_document_history]作为[Extent2] 其中[Filter1].[id]=[Extent2].[repair\u document\u id]和4=将[Extent2].[status]转换为int,将[Extent2].[status]转换为int不为NULL 由[Extent2]订购。日期为[Element1] -p__linq__0:'1/1/0001 12:00:00 AM'类型=日期时间2 请注意末尾的顺序

这快把我逼疯了!我做错了什么?另外,将数据加载到内存不是一个选项,我有大约5000个dcn,每个dcn的历史记录表中有10-15条记录

谢谢

编辑:

这是实体声明

public class RepairDocument {
   /* .... */
   public virtual ICollection<RepairDocumentHistory> History { get; set; }
}

如果您改为使用:

var justOneDcn = context.RepairDocuments.Where(d => d.Dcn = "00001").OrderBy(d => d.History.Date);

并从下面的命令中删除了OrderBy。

您能这样做吗:

var item =
(from r in context.RepairDocuments
from h in r.History
where r.Dcn == "00001" && h.Status == DocumentStatus.Xda
orderby h.Date
select h).FirstOrDefault();

那不会编译。历史记录是维修文档的子集合,可以像contex.repairdocumes.includehistory那样包含历史记录,然后通过Corry用户1718673尝试订购,您完全正确。如果选择子表历史记录作为主实体,然后包含父实体,会怎么样?然后,您可以轻松地按所选的主要实体进行订购。