#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,
чтобы сообщить компилятору, что в любом случае это строка, даже если она не предоставлена.