C# 实体框架按一对多实体排序

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; }

我见过类似的例子,但找不到答案。我有两份出版物和作者。 Author不是强制性的,当我按Publication.Author.姓氏排序时,我会得到NullReferenceException,因为发布并不总是有相关的作者。我如何编写这个简单的查询?为什么EhtityFramework知道如何处理这个问题

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的新手,所以这可能是我正在做的事情。