возврат логического значения, если поле БД содержит данные - PullRequest
2 голосов
/ 22 января 2012

У меня есть объектная модель, которая содержит логическое значение MyBool, и у меня есть таблица, которая содержит поле MyField. Я пишу запрос linq-to-sql, который должен возвращать список объектов с MyBool, установленным в true или false, в зависимости от того, имеет ли MyField значение.

Это то, что я имею до сих пор:

var TheListOfObjects = (from thetable in MyDC.TheTable
                        ....
                        select new MyObject()
                        {
                            MyBool = thetable.MyField.Contains("*")

                         }).ToList();

I ошибка: Нулевое значение не может быть назначено члену с типом System.Boolean, который является необнуляемым типом значения. Contains не возвращает бул?

Чего мне не хватает? Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 января 2012

Харис Хасан прав. Чтобы действительно понять эту проблему, подумайте о том, в какой код SQL ваш C # может превратиться:

(CHARINDEX(MyField, '*', 1) - 1)

Но если MyField имеет значение null, это выражение само становится нулевым!

Linq2Sql не гарантирует семантику C #! Это обеспечивает хорошее приближение семантики C #, но все же близко к модели SQL.

Вы можете исправить это, сказав

MyBool = (bool?)thetable.MyField.Contains("*") ?? false

или, сказав

MyBool = thetable.MyField != null && thetable.MyField.Contains("*")

Вы также можете сделать MyBool обнуляемым, но это, вероятно, не то, что вы делаете.

Кстати, вы получите то же странное поведение при левом соединении, которое «не удастся», потому что SQL заполнит объединенную строку NULL.

2 голосов
/ 22 января 2012

, если вы не хотите обнуляемое свойство в MyObject, вы можете проверить на нулевое значение при назначении

var TheListOfObjects = (from thetable in MyDC.TheTable
                        ....
                        select new MyObject()
                        {
                            MyBool = (thetable.MyField == null) ? false : thetable.MyField.Contains("*") //check if it's null in-line

                         }).ToList();
1 голос
/ 22 января 2012

Вам нужно сделать вашу переменную bool обнуляемой, чтобы она могла принимать возможное нулевое значение, возвращаемое DB

Измените bool MyBool {get;set;} на bool? MyBool {get;set;}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...