2016-02-11 2 views
0

В моей таблице базы данных у меня есть 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 
+0

Возможный дубликат [Обработка нулевых значений в ИНЕКЕ с помощью LINQ к SQL] (http://stackoverflow.com/questions/2411894/handling-null-values -in-where-clause-using-linq-to-sql) – DGibbs

+0

См. http://henrylu.me/2014/07/05/null-value-handling-in-entity-framework/ –

+0

DGibbs, как я сказал в вопрос, который я пытался использовать методом object.Equals, и он не решил мою проблему, поэтому это не может быть дубликатом. – Jeremy

ответ

1

Обновление вашей модели сущностей, чтобы не позволить NULL значения в первую очередь ... Вы должны установить все поля, которые в настоящее время NULL в пустую строку перед попыткой (вы можете установить их через SSMS) ...

После того, как вы установили все нулевые значения в пустую строку.
Добавить этот атрибут в собственность Code.

[Required(AllowEmptyStrings = true)] 
public string Code { get; set; } 

И перенести эти изменения.

С этого момента вы можете просто сделать Foo.Code == string.Empty

+0

Привет, Я сталкиваюсь с аналогичной проблемой .. Мы используем подход Database First и EF 6.1.3. Запросом, который мы пытаемся, является employee.where (a => a.employeename == parametervalue || a.employeename == null) .ToList() .. Это не возвращает записи, которые имеют нулевое значение в utileename колонка .. не могли бы вы помочь мне в этом .. –

+0

@ ps_prakash02 возвращает значения, когда вы пытаетесь выполнить проверку сравнения со строкой. empty вместо null –

+0

, когда я сравниваю это с "", тогда он возвращает запись, которая имеет пустое значение в столбце employeeeename .., но я хочу получить записи, которые имеют нуль в столбце employeeeename. –

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