C# 在EF6 C中订购已加载的导航属性数据#
我正在努力寻找一个适用于我在StackOverflow上遇到的情况的合适答案。我试图订购已加载的导航属性数据,但我不确定如何正确编写Linq查询 我的类型如下: 这是父类型:C# 在EF6 C中订购已加载的导航属性数据#,c#,entity-framework,linq,entity-framework-6,C#,Entity Framework,Linq,Entity Framework 6,我正在努力寻找一个适用于我在StackOverflow上遇到的情况的合适答案。我试图订购已加载的导航属性数据,但我不确定如何正确编写Linq查询 我的类型如下: 这是父类型: public class Diary { public Diary() { Appointments = new List<Appointment>(); } public int Id{ get; set; } public DateTime D
public class Diary
{
public Diary()
{
Appointments = new List<Appointment>();
}
public int Id{ get; set; }
public DateTime DiaryDate { get; set; }
public List<Appointment> Appointments { get; set; }
}
办公室枚举是
public enum
{
Office1,
Office2,
Office3,
Office4
}
我的存储库代码,我试图返回一个带有链接约会的个人日记,如下所示。我不想过滤所有的数据,我只想能够按office num排序navigation属性,这样我的最终输出将与屏幕上的类似
日记日期
办公室1
办公室2
等等
存储库代码如下
public Diary ReturnDiaryById(int id)
{
using(DiaryContext context = new DiaryContext())
{
var returnDiary = context.Diary.AsNoTracking().Include(a => a.Issues)
.Select(b => new Diary
{
Appointments = (List<Appointment>)b.Appointments.OrderBy(c => c.Office),
Id = b.Id,
DiaryDate = b.DiaryDate
}
).FirstOrDefault();
return returnDiary;
}
}
public Diary ReturnDiaryById(int-id)
{
使用(DiaryContext=new DiaryContext())
{
var returnDiary=context.Diary.AsNoTracking().Include(a=>a.Issues)
.选择(b=>新建日记)
{
约会=(列表)b.约会.订购人(c=>c.办公室),
Id=b.Id,
日记日期=b.日记日期
}
).FirstOrDefault();
返回日志;
}
}
此代码可编译,但在运行时编译不支持的异常
我希望我已经解释了我试图实现的目标,并且我的代码粗略地推断了它,如果没有,我可以澄清任何事情
感谢您在建议方面提供的帮助,非常感谢您的所有输入可能EF正在努力理解您的ENUM orderby到SQL查询的转换 在您的例子中,在SQL端执行排序与在C#端执行排序之间没有太大的性能差异。。(因为我们已经把所有约会都带进了一本日记) 因此,请尝试此查询,并告诉我们此查询是否有效:
public Diary ReturnDiaryById(int id)
{
using(var context = new DiaryContext())
{
var returnDiary = context.Diary.AsNoTracking().Include(a => a.Appointments)
.FirstOrDefault(d => d.Id == id);
if (returnDiary != null)
{
returnDiary.Appointments = returnDiary.Appointments.OrderBy(c => c.Office.ToString()).ToList();
}
return returnDiary ;
}
谢谢你,我假设枚举与整数有效相关,它可以自己排序,但是很清楚!这是一个很好的假设,除了LINQ和SQL之外,你用C#写的东西需要无阻抗地翻译成SQL,EF系统才能理解翻译。。e、 g.枚举、包含检查、LINQ查询中的C#函数调用都是EF或任何LINQ2SQL提供程序都不知道如何转换为SQL代码的构造。这就是脱节的原因。C#Enum在SQL中没有自然等价物。有一些聪明的方法可以将它映射到一个表(Id对应于int-enum值)并根据类似enum的列进行排序,但在您的情况下,您不需要它
public Diary ReturnDiaryById(int id)
{
using(var context = new DiaryContext())
{
var returnDiary = context.Diary.AsNoTracking().Include(a => a.Appointments)
.FirstOrDefault(d => d.Id == id);
if (returnDiary != null)
{
returnDiary.Appointments = returnDiary.Appointments.OrderBy(c => c.Office.ToString()).ToList();
}
return returnDiary ;
}