2017-02-22 5 views
0

Использование структуры сущности, я пытаюсь выбрать записи и связанные с ними дочерние записи. Дочерние записи могут быть пустыми, поэтому я хотел бы просто вернуть пустую строку, если они есть. Я получаюЗапрос Linq, включая пустые дочерние объекты

ссылочных нулевого исключение

при попытке выполнить следующий код.

var query = ctx.UserAlerts.Include(x=>x.DocumentType).Where(x => x.UserId == userId).ToList(); 
var alerts = query.Select(u => new AlertConfigVM 
      { 
       UserId = u.UserId, 
       Destination = u.AlertDestination, 
       TypeofAlert = u.TypeofAlert, 
       HourInterval = u.IntervalAsHours, 
       DocumentTypeName= u.DocumentType.Name??string.Empty 
      }).ToList(); 

здесь мои Сущности

public class UserAlert 
{ 
    public int Id { get; set; } 
    public string UserId { get; set; } 
    public User User { get; set; } 
    public int TypeofAlert { get; set; } 
    public string AlertDestination { get; set; } 
    public int? DocumentTypeId { get; set; } 
    public virtual DocumentType DocumentType { get; set; } 
    public int? IntervalAsHours { get; set; } 
} 

public class DocumentType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Key { get; set; } 
} 

и вот мой тип возвращаемого значения.

public class AlertConfigVM 
{ 
    public int Id { get; set; } 
    public string UserId { get; set; } 
    public User User { get; set; } 
    public int TypeofAlert { get; set; } 
    public string Destination { get; set; } 
    public int? DocumentTypeId { get; set; } 
    public string DocumentTypeName { get; set; } 
    public int? HourInterval { get; set; } 
} 
+0

Убедитесь, что documentType не имеет значения null, прежде чем проверять, не является ли documenttype.name. – Forklift

+0

как бы я это сделал? Можете ли вы опубликовать пример? –

+1

Возможный дубликат [Что такое исключение NullReferenceException и как его исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

ответ

3

Изменить это:

DocumentTypeName= u.DocumentType.Name??string.Empty 

к этому:

DocumentTypeName= u.DocumentType?.Name??string.Empty 

Это позволит DocumentType по умолчанию String.Empty если нуль.

+0

Удивительно, что сработало отлично. Я не понимал, что ты можешь это сделать. Где ты взял этот маленький трюк? –

+0

Честно говоря, я «случайно» обнаружил его с помощью ReSharper, если честно. – tjcertified

+2

Обратите внимание, что это решение ** ТОЛЬКО ** работает в Visual Studio 2015, а затем с MSBuild с использованием Roslyn. – Cameron

1

С tjcertified's answer работает только в Visual Studio 2015 и позже, это решение должно работать независимо от окружающей среды:

var query = ctx.UserAlerts.Include(x=>x.DocumentType).Where(x => x.UserId == userId).ToList(); 
var alerts = query.Select(u => new AlertConfigVM 
      { 
       UserId = u.UserId, 
       Destination = u.AlertDestination, 
       TypeofAlert = u.TypeofAlert, 
       HourInterval = u.IntervalAsHours, 
       DocumentTypeName= u.DocumentType != null 
            ? u.DocumentType.Name != null 
             ? u.DocumentType.Name 
             : string.Empty 
            : string.Empty 
      }).ToList(); 

Операция ?: является ternary operator и так же, как обычный if-else заявление.

+3

Вы можете сделать это короче: ('u.DocumentType == null? Null: u.DocumentType.Name) ?? string.Empty' –

+0

@AndersonPimentel Nice catch. Не думал об этом. – Cameron

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