你如何重载Linq的Where子句接受SqlBoolean?

时间:2014-07-16 22:55:10

标签: c# .net linq boolean linq-to-objects

Linq的Where子句适用于布尔值。你如何使用sqlBooleans。以下是用于说明问题的示例代码

// Trivia example to draw attention to the problem 
var nodeCollection = new List<SqlBoolean>();
nodeCollection.Add(SqlBoolean.Parse("0"));
nodeCollection.Add(SqlBoolean.Parse("1"));
nodeCollection.Add(SqlBoolean.Parse("1"));

var nodeA = SqlBoolean.Parse("1");
var trueOne = nodeCollection.Where(n => n == nodeA); // Error message, cannot convert SqlBoolean to bool

您收到错误,因为谓词的结果是SqlBoolean而不是bool。如何扩展Where子句以使其工作。使用强制转换,SqlBoolean的Value,IsTrue和IsFalse是不可取的。

2 个答案:

答案 0 :(得分:3)

您必须将SqlBoolean转换为bool。你可以把它explicitly

var trueOne = nodeCollection.Where(n => (bool)(n == nodeA));  

或比较Value属性:

var trueOne = nodeCollection.Where(n => n.Value == nodeA.Value); 

问题在于SqlBoolean == SqlBooleanequality operator is overridden以来SqlBoolean返回bool而不是{{1}}。

答案 1 :(得分:1)

您可以创建一个扩展方法来包装Where

public static IEnumerable<T> WhereSqlBoolean<T>(
    this IEnumerable<T> source, Func<T,SqlBoolean> condition) {
    return source.Where(t => (bool)condition(t));
}

仍然不是最干净的,但有效:

var trueOne = nodeCollection.WhereSqlBoolean(n => n == nodeA);