обработка значений массива нулевых байтов в запросе LINQ - PullRequest
0 голосов
/ 31 августа 2010

У меня есть следующий код LINQ:

docTypes = (from c in context.Citizenships join
            cdt in context.Citizenship_Document_Types 
                       on c.Country_Code equals cdt.Country_Code
            from cd in context.Citizenship_Documents
                              .Where(cd => cd.Citizenship_Id == c.Citizenship_ID)
                              .DefaultIfEmpty()
            where c.Citizenship_ID == citizenshipId
            select new CitizenshipDocument
    {
                Id = (int?)cd.Citizenship_Document_Id??-1,
                CitizenshipId = c.Citizenship_ID,
                DocumentTypeId = cdt.Citizenship_Document_Type_Id,
                DocumentTypeName = cdt.Citizenship_Document_Type_Name,
                DocumentCode = cd.Citizenship_Document_Code.ToArray(),
                ExpirationDate = cd.Expiration_Date,
                IssueDate = cd.Issue_Date
    }).ToList();

Проблема в том, что когда cd.Citizenship_Document_Code возвращает ноль, я получаю ошибку при использовании .ToArray() :

Ссылка на объект не установлена ​​на экземпляр объекта

Как я могу обработать нулевые значения?

Ответы [ 2 ]

1 голос
/ 31 августа 2010

Вы бы обрабатывали пустые значения в запросе LINQ так же, как обрабатывали бы их где-либо еще. Не разыменовывайте нулевое значение! Например:

docTypes = (from c in context.Citizenships join
            cdt in context.Citizenship_Document_Types
            on c.Country_Code equals cdt.Country_Code
            from cd in context.Citizenship_Documents.Where(
                cd => cd.Citizenship_Id == c.Citizenship_ID).DefaultIfEmpty()
            where c.Citizenship_ID == citizenshipId
            select new CitizenshipDocument
            {
                Id = (int?)cd.Citizenship_Document_Id??-1,
                CitizenshipId = c.Citizenship_ID,
                DocumentTypeId = cdt.Citizenship_Document_Type_Id,
                DocumentTypeName = cdt.Citizenship_Document_Type_Name,
                DocumentCode = cd.Citizenship_Document_Code == null ?
                    null : 
                    cd.Citizenship_Document_Code.ToArray(),
                ExpirationDate = cd.Expiration_Date,
                IssueDate = cd.Issue_Date
            }).ToList();
0 голосов
/ 31 августа 2010

Подумайте об обработке нуля с соответствующим нулевым объектом, используя что-то вроде следующего метода расширения:

public static T ToNonNull<T>(this T input) where T : class, new()
{
  if (input != null)
  {
    return input;
  }
  return new T();
}

Использование будет выглядеть примерно так:

DocumentCode = cd.Citizenship_Document_Code.ToNonNull().ToArray()

Вы также можете иметьспецифическое расширение ToNonNull () только для этого типа, если вы не хотите универсальное расширение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...