2012-06-30 3 views
4

Я пытаюсь сортировать привязку модели представления к нескольким свойствам. Проблема в том, что второе свойство может иметь значение NULL, и я получаю исключение с нулевой ссылкой.Linq ThenBy Возможно Null

return this.People 
    .OrderBy(x => x.Car.Name) 
    .ThenBy(x => x.Pet.Name); 

Что делать, если Pet не имеет значения? Как я все еще делаю сортировку ThenBy по имени Pet.Name?

+1

Как заказать нуль-животных, первый или последний? –

ответ

9

Это должно вернуть null Домашние животные до ненужных домашних животных.

return this.People 
    .OrderBy(x => x.Car.Name) 
    .ThenBy(x => x.Pet != null ? x.Pet.Name : ""); 
+1

Как насчет замены 'x.Pet! = Null? x.Pet.Name: "" с оператором с косой связью (и менее восприимчивым к опечаткам)? 'x.Pet ?? string.Empty' – spender

+1

@spender: Это будет работать только в том случае, если 'Pet' реализует интерфейс [' IComparable'] (http://msdn.microsoft.com/en-us/library/4d7sx9hd.aspx). –

+0

К сожалению. Неправильный ответ. 'Pet' не являются (обязательно) строками. – spender

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()); 

Примечание: это будет делать обратное запросу в верхней части этого ответа - он будет сортировать людей без домашних животных на дно (в пределах названия автомобиля).

+0

Спасибо, DanM. Тот же ответ, что и другой, и мне пришлось выбрать только один ... –

+0

Нет проблем ... Я добавил дополнительный контент. – devuxer

+0

Я ценю это. Отличный ответ. –

2

Вы можете использовать Null Object pattern для домашних животных и автомобилей, чтобы избежать каких-либо дополнительных проверок на нуль в таких случаях, и свести к минимуму риск возможного NullReferenceException.

+0

Отличная точка. Я должен это делать. Тем не менее, другие ответили на вопрос. Благодаря! –

Смежные вопросы