我正在尝试对多个属性上的视图模型绑定进行排序。问题是第二个属性可能为空,我得到一个空引用异常。
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet.Name);
如果 Pet 为空怎么办?我如何仍然按 Pet.Name 进行 ThenBy 排序?
这应该在非 null Pets 之前返回 null Pets。
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet != null ? x.Pet.Name : "");
如果你想让没有宠物的人排在有宠物的人之上,你可以使用这个:
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet == null ? string.Empty : x.Pet.Name);
如果您要进行许多涉及宠物的排序操作,您可以创建自己的PetComparer
继承自 的类Comparer<Pet>
,如下所示:
public class Pet
{
public string Name { get; set; }
// other properties
}
public class PetComparer : Comparer<Pet> //
{
public override int Compare(Pet x, Pet y)
{
if (x == null) return -1; // y is considered greater than x
if (y == null) return 1; // x is considered greater than y
return x.Name.CompareTo(y.Name);
}
}
现在,您的查询将如下所示:
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet, new PetComparer());
注意:这将与此答案顶部的查询相反 - 它将没有宠物的人排序到底部(在汽车名称内)。
您可以对宠物和汽车使用Null 对象模式,以避免在这种情况下对 null 进行任何额外检查,并将可能的NullReferenceException
.
一起使用 null 条件 ( ?.
) 和 null 合并 ( ??
) 运算符,您可以做到这一点 -
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet?.Name ?? string.Empty);