複数のプロパティでビュー モデル バインディングを並べ替えようとしています。問題は、2 番目のプロパティが null である可能性があり、null 参照例外が発生することです。
return this.People
.OrderBy(x => x.Car.Name)
.ThenBy(x => x.Pet.Name);
Pet が null の場合はどうなりますか? Pet.Name による ThenBy 並べ替えを行うにはどうすればよいですか?
これは、null 以外の Pet の前に null の Pet を返す必要があります。
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
ます。