Linq сравнить перед вставкой в ​​базу данных - PullRequest
0 голосов
/ 08 сентября 2010

HI,

У меня есть таблица Ling с MyObject.

Имеются поля:

Имя идентификационного номера

Существует метод, который добавляетne MyObject to Database.В частичном классе MyOBject я реализую метод OnValidate.Мне нужно проверить, существует ли уже строка с таким номером и именем.

Проблема в том, что эти значения равны нулю (для этого примера оба могут быть)

var result = from m in myContext.MyObjects where m.Number == this.Number &&
m.Name == this.Name
select m;

if(result.Count > 0) {
   throw ...
}

, если, например,this.Name = null и r.Name = null и m.Number == this.Number Строки не выбраны, и я не знаю, почему: /

Любые подсказки о том, как проверить, является ли строка точно такой жезначения в полях, кроме Id (то есть PK), уже есть в базе данных?

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

В Linq-To-SQL возникает проблема, когда вы задаете ему выражение Equals с параметром NULL, который считается пустым - создаваемый им запрос неверен.Вы можете прочитать все об этом здесь: http://riotingbits.com/2009/int-null-or-why-it-misbehaves-in-linq-to-sql/

Вы должны рассматривать случаи, когда this.Number или this.Name равны нулю отдельно.

IQueryable<MyObject> result = null;

if (this.Name == null && this.Number == null)
    result = from m in myContext.MyObjects
             where m.Name == null && m.Number == null
             select m;
else if (this.Name == null)
    result = from m in myContext.MyObjects
             where m.Name == null && m.Number == this.Number
             select m;
else if (this.Number == null)
    result = from m in myContext.MyObjects
             where m.Name == this.Name && m.Number == null
             select m;
else
    result = from m in myContext.MyObjects
             where m.Name == this.Name && m.Number == this.Number
             select m;
0 голосов
/ 10 сентября 2010

Попробуйте это:

var result = from m in myContext.MyObjects
               where (((m.Number == this.Number) || (m.Number == null)) &&
                     ((m.Name == this.Name) || (m.Name == null)))
               select m;

SQL-запрос, который генерирует LINQ, будет:

SELECT Whatewer yourObject contains
FROM yourTable as [t0]
WHERE (([t0].[Number] = @p0) OR ([t0].[Number] IS NULL))
    AND (([t0].[Name] = @p1) OR ([t0].[Name] IS NULL))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...