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是不可取的。
答案 0 :(得分:3)
您必须将SqlBoolean
转换为bool
。你可以把它explicitly:
var trueOne = nodeCollection.Where(n => (bool)(n == nodeA));
或比较Value
属性:
var trueOne = nodeCollection.Where(n => n.Value == nodeA.Value);
问题在于SqlBoolean == SqlBoolean
自equality 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);