C# 实体框架按一对多实体排序
我见过类似的例子,但找不到答案。我有两份出版物和作者。 Author不是强制性的,当我按Publication.Author.姓氏排序时,我会得到NullReferenceException,因为发布并不总是有相关的作者。我如何编写这个简单的查询?为什么EhtityFramework知道如何处理这个问题C# 实体框架按一对多实体排序,c#,.net,entity-framework,C#,.net,Entity Framework,我见过类似的例子,但找不到答案。我有两份出版物和作者。 Author不是强制性的,当我按Publication.Author.姓氏排序时,我会得到NullReferenceException,因为发布并不总是有相关的作者。我如何编写这个简单的查询?为什么EhtityFramework知道如何处理这个问题 public class Publication { [Key] public int ID { get; set; } public string Title { get; set; }
public class Publication {
[Key]
public int ID { get; set; }
public string Title { get; set; }
[Display(Name = "Author")]
public int? AuthorId { get; set; }
public virtual Author Author { get; set; }
}
public class Author{
[Key]
public virtual int ID { get; set; }
public virtual string Forename { get; set; }
public virtual string Surname { get; set; }
}
this.db.Publications
.OrderBy(p=>p.Author.Surname)
.Skip(skip)
.Take(model.PageSize).ToList();
失败,因为发布不总是有相关作者。注:db是实体框架DBContext,如下所示:
public class PPRDBContext : DbContext
{
public DbSet<Publication> Publications { get; set; }
public DbSet<Author> Authors { get; set; }
}
公共类PPRDBContext:DbContext
{
公共数据库集发布{get;set;}
公共数据库集作者{get;set;}
}
这不是EF的错——这是我所知道的任何语言在访问被引用对象属性时的常见陷阱 根据您是否希望将空值放在第一位,您可以执行以下操作:
.OrderBy(p=> p.Author == null ? "" : p.Author.Surname)
.OrderBy(p=> p.Author == null ? "ZZZZZ" : p.Author.Surname)
如果您希望空值最后出现,请使用以下内容:
.OrderBy(p=> p.Author == null ? "" : p.Author.Surname)
.OrderBy(p=> p.Author == null ? "ZZZZZ" : p.Author.Surname)
这不是EF的错——这是我所知道的任何语言在访问被引用对象属性时的常见陷阱 根据您是否希望将空值放在第一位,您可以执行以下操作:
.OrderBy(p=> p.Author == null ? "" : p.Author.Surname)
.OrderBy(p=> p.Author == null ? "ZZZZZ" : p.Author.Surname)
如果您希望空值最后出现,请使用以下内容:
.OrderBy(p=> p.Author == null ? "" : p.Author.Surname)
.OrderBy(p=> p.Author == null ? "ZZZZZ" : p.Author.Surname)
数据库出版物的类型是什么?如果它是IQueryable(例如IDbSet),EF将把表达式转换为SQL代码,也就是说,p.Author.姓氏没有实际执行,因此它不会抛出异常。EF将生成类似于外部联接的内容,空作者将作为其他值排序。我在没有进一步修改的情况下实现了这一点。如果您得到异常,它可能是一个IEnumerable而不是IQueryable的标志,这意味着序列在内存中。lgoncalves-我添加了db(DBContext)代码以显示我从何处获得发布。所以Publications是一个DbSet,但它仍然抛出异常。我让它在这里工作。。我不明白为什么会这样。数据库的发布类型是什么?如果它是IQueryable(例如IDbSet),EF将把表达式转换为SQL代码,也就是说,p.Author.姓氏没有实际执行,因此它不会抛出异常。EF将生成类似于外部联接的内容,空作者将作为其他值排序。我在没有进一步修改的情况下实现了这一点。如果您得到异常,它可能是一个IEnumerable而不是IQueryable的标志,这意味着序列在内存中。lgoncalves-我添加了db(DBContext)代码以显示我从何处获得发布。所以Publications是一个DbSet,但它仍然抛出异常。我让它在这里工作。。我不明白为什么会发生这种情况。是的,我也不喜欢这个答案(对不起,斯坦利)——但它是有效的。我宁愿把这事弄清楚。我是EF的新手,所以这可能是我正在做的事情。是的,我也不喜欢这个答案(对不起,D斯坦利)-但它很有效。我宁愿把这事弄清楚。我是EF的新手,所以这可能是我正在做的事情。