В моей таблице базы данных у меня есть 54 строки, из них 53 являются NULL в столбце Code, который определяется как varchar (100). (Я подтвердил, что эти поля равны нулю, выполняя запросы непосредственно в базе данных, используя мой Microsoft SQL Management Studio) Я пытался использовать следующий LINQ код, чтобы вернуть все строки, где поле является пустым:C# linq-sql проверка нулевой строки
public IQueryable<LocationHeader> LocationHeaders
{
return from p in Context.LocationTypes
where p.Code == null
select new LocationHeader
{
ID = p.ID,
Description = p.Description,
Code = p.Code
};
}
Я также обнаружил, что если Iremove предложение where, а затем вызвать ToList() в свой Свойство LocationHeaders и затем запросить его, он вернет только 53 строки, которые я ожидаю.
var test = LocationHeaders.ToList().Where(x => x.Code == null);
Я также попытался p.Code.Equals (нуль) и Object.equals (p.Code, нуль), как предложено в связанных с этим вопросов на этом сайте и в других местах. Он всегда возвращает пустую коллекцию. Если я изменю его на p.Code! = Null, он вернет все 54 строки (53 из которых имеют нулевой столбец кода, а 1 - нет), но я просматриваю эти объекты, для свойства Code установлено значение null.
Я также пытался обнулить сливаться свою собственность код в пустую строку, чтобы я мог проверить позже:
Code = p.Code ?? string.Empty
Но это не изменилось ровно ничего, когда я рассматривал детали после того, как запрос был выполнен, свойство кода моих объектов по-прежнему установлено значение null.
Кто-нибудь знает, почему это может быть и что я могу сделать, чтобы исправить это? Я использую EF 6 Code-First, если это имеет значение.
EDIT: Я постоянно изменил код, чтобы прочитать так:
public IQueryable<LocationHeader> LocationHeaders
{
return from p in Context.LocationTypes
where object.Equals(p.Code, null)
select new LocationHeader
{
ID = p.ID,
Description = p.Description,
Code = p.Code
};
}
и я, наконец, подумал проверить запрос с использованием профилировщика SQL Server. Он по-прежнему писать запрос, как это:
exec sp_executesql N'SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Description] AS [Description],
[Extent1].[Code] AS [Code]
FROM [dbo].[LocationType] AS [Extent1]
WHERE [Extent1].[Code] = @p__linq__0',N'@p__linq__0 nvarchar(4000)',@p__linq__0=NULL
Возможный дубликат [Обработка нулевых значений в ИНЕКЕ с помощью LINQ к SQL] (http://stackoverflow.com/questions/2411894/handling-null-values -in-where-clause-using-linq-to-sql) – DGibbs
См. http://henrylu.me/2014/07/05/null-value-handling-in-entity-framework/ –
DGibbs, как я сказал в вопрос, который я пытался использовать методом object.Equals, и он не решил мою проблему, поэтому это не может быть дубликатом. – Jeremy