Лямбда-выражение с <bool>и System.Nullable <bool> - PullRequest
2 голосов
/ 08 июля 2011

Это не скомпилируется:

void Foo()
{
    using (var db = new BarDataContext(ConnectionString))
    {
        // baz is type 'bool'
        // bazNullable is type 'System.Nullable<bool>'
        var list = db.Bars.Where(p => p.baz && p.bazNullable); // Compiler: 
            // Cannot apply operator '&&' to operands of type
            // 'System.Nullable<bool> and 'bool'
    }
}

Действительно ли мне нужно сделать это через два прогона, где я сначала использую условие as, а затем пробегаю по этому списку с условиями Nullable илилучший чистый гладкий лучший способ сделать это?

Ответы [ 7 ]

8 голосов
/ 08 июля 2011
p.bazNullable.GetValueOrDefault()
5 голосов
/ 08 июля 2011

Как-то так?

 db.Bars.Where(p => p.baz && p.bazNullable.HasValue && p.bazNullable.Value);

Я не знаю, справится ли Linq-to-Sql.

3 голосов
/ 08 июля 2011

Здесь есть два вопроса:

Короткое замыкание && по каким-либо причинам не поддерживается в обнуляемых типах. (Связано Почему на `bool нет отмененных операторов короткого замыкания??? )

Во-вторых, даже если он поддерживается C #, ваш код по-прежнему не имеет смысла. Where нуждается в bool в качестве типа результата вашего состояния, а не bool?. Таким образом, вам нужно решить, как следует рассматривать случай, в котором baz==true и bazNullable==null.

Это приводит к p.baz && (p.bazNullable==true) или p.baz && (p.bazNullable!=false) в зависимости от того, что вы хотите.

Или альтернативно p.baz && (p.bazNullable??false) или p.baz && (p.bazNullable??true)

1 голос
/ 08 июля 2011

Вы пытаетесь применить логическую операцию && к очищаемому логическому значению.

Если вы уверены, что p.bazNullable не равен нулю, тогда вы можете попробовать

var list = db.Bars.Where(p => p.baz && p.bazNullable.Value);

или если нулевое значение равно false, попробуйте

var list = db.Bars.Where(p => p.baz && p.bazNullable.ValueOrDefault(false));
0 голосов
/ 08 июля 2011

Как насчет этого

Where(p => p.baz && (p.bazNullable ?? false));

ИЛИ

Where(p => p.baz && (p.bazNullable ==null ? false : p.bazNullable.Value));
0 голосов
/ 08 июля 2011

Вы могли бы просто сделать:

var list = db.Bars.Where(p => p.baz && p.bazNullable != null && p.bazNullable == true);
0 голосов
/ 08 июля 2011

использование:

  var list = db.Bars.Where(p => p.baz && p.bazNullable.Value);

Для обработки нулевых исключений используйте:

  var list = db.Bars.Where(p => p.baz && p.bazNullable != null && p.bazNullable.Value);
...