我正在尝试对多个属性进行视图模型绑定。问题是第二个属性可能为null,我得到一个空引用异常。
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet.Name);
如果Pet为null怎么办?我如何按Pet.Name进行ThenBy排序?
答案 0 :(得分:9)
这应该在非零宠物之前返回null宠物。
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet != null ? x.Pet.Name : "");
答案 1 :(得分:3)
如果您希望没有宠物的人被分类到有宠物的人之上,您可以使用:
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());
注意:这将与此答案顶部的查询相反 - 它会将没有宠物的人排序到底部(在汽车名称中)。
答案 2 :(得分:2)
您可以将Null Object pattern用于宠物和汽车,以避免在这种情况下对null进行任何额外检查,并将可能的NullReferenceException
风险降至最低。
答案 3 :(得分:0)
一起使用空条件(?.
)和空合并(??
)运算符,您可以做到这一点-
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet?.Name ?? string.Empty);