Ошибка запроса LINQ для нулевых значений

#linq #ado.net #dataset #linq-to-dataset

#linq #ado.net #набор данных #linq-to-dataset

Вопрос:

 var query = from t1 in Table1
            join t2 in Table2
                on new { t1.Id }
                equals new { t2.Id}
            select new
            {
                t1.Id,
                t1.FirstName,
                t1.MiddleName,//allows null values in the database
                t1.LastName,
                t1.phone //allows null values in the database

            };
if(query.Count()>0)//fails here"The value for column MiddleName in table'Table1' is DBNULL"
{
}
  

Есть ли способ, которым я могу получить все строки, включая нулевые значения для MiddleName и Phone в моем запросе LINQ?

Комментарии:

1. какой тип данных для «промежуточного имени» и «телефона»?

2. Table1 и Table2 правы DataTable ли вы, вы не используете Linq для SQL?

3. Почему вы присоединяетесь к T2? Вы никогда не использовали это, вы уже отфильтровали набор?

4. Я просто пытаюсь упростить запрос. Я использую поля из другой таблицы. Да, обе таблицы1 и таблица2 являются таблицами данных.

Ответ №1:

Если вы используете linq-to-datasets, вы должны вручную преобразовать столбцы с нулевым значением в null, поскольку их значение в DataRow равно DBNull.Value . В строго типизированном наборе данных вы должны быть в состоянии сделать что-то вроде:

 var query = from t1 in Table1
        join t2 in Table2
            on new { t1.Id }
            equals new { t2.Id}
        select new
        {
            t1.Id,
            t1.FirstName,
            t1.IsMiddleNameNull ? null : t1.MiddleName,
            t1.LastName,
            t1.IsPhoneNull ? null : t1.Phone 
        };
  

В нетипизированном наборе данных вы вызовете что-то вроде t1.IsNull("MiddleName") ? null : t1["MiddleName"]

Комментарии:

1. Это то, что я получаю ……. Ошибка 11: недопустимый аноним-член типа declarator. Члены анонимного типа должны быть объявлены с назначением члена, простым именем или доступом к члену.

2. Да, это проблема с анонимным типом. Он не может вывести тип из null .

3. Если вы хотите использовать анонимный тип, вам следует перенести условный код в пользовательское свойство. Добавьте частичный класс к вашему строго типизированному потоку данных и предоставьте такие свойства, как MiddleNameNullable и PhoneNullable.

Ответ №2:

Похоже, что метаданные не синхронизированы со схемой вашей базы данных. Кажется, что, когда классы были сгенерированы для вашей схемы, MiddleName не было nullable, но теперь это так. В этом случае вам необходимо обновить ваш EDMX, если вы используете Entity Framework, или обновить ваши классы, если вы используете LINQ to SQL.

Комментарии:

1. Я не думаю, что проблема в этом.

2. Хорошо, вы не предоставляете достаточно информации, чтобы помочь вам, так что это мое предположение, основанное на возникшей у вас проблеме. LINQ — это общая технология, вам необходимо предоставить более подробную информацию о том, какого поставщика вы используете (Entity Framework? LINQ2SQL? чистые объекты?) а также публикация полной трассировки стека вашего исключения помогла бы намного больше.

3. Ошибка: значение для столбца ‘MiddleName’ в таблице ‘Table1’ равно DBNull.

4. Я считаю, что ответ Ладислава является правильным на данный момент. Вы пробовали это?

Ответ №3:

Не могли бы вы, пожалуйста, попробовать

 var query = from t1 in Table1
            join t2 in Table2
                on new { t1.Id }
                equals new { t2.Id}
            select new
            {
                Id = t1.Id,
                FirstName = t1.FirstName,
                MiddleName = t1.MiddleName,//allows null values in the database
                LastName = t1.LastName,
                Phone = t1.phone //allows null values in the database

            };
if(query.Count()>0)//fails here"The value for column MiddleName in table'Table1' is DBNULL"
{
}
  

Ответ №4:

Проблема в том, что новый анонимный объект имеет свои свойства, определенные «на лету», с типами, выведенными из значений.

В такой строке

 MiddleName = t1.MiddleName,//allows null values in the database 
  

создается новое свойство с именем MiddleName, тип которого равен t1.Тип MiddleName. Но если t1.MiddleName равно null, каков тип??? У Null нет типа.

Чтобы предотвратить любую двусмысленность, просто поместите

 MiddleName = (string)t1.MiddleName,
  

чтобы сообщить компилятору, что в любом случае это строка, даже если она не предоставлена.