如何重载Linq's Where子句来接受SqlBoolean
本文关键字:子句 Where SqlBoolean 何重载 重载 Linq | 更新日期: 2023-09-27 18:13:13
Linq的Where子句适用于布尔值。如何让它与sqlboolean一起工作?下面是示例代码来说明
问题// 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是不可取的。
您必须将SqlBoolean
转换为bool
。您可以显式地强制转换它:
var trueOne = nodeCollection.Where(n => (bool)(n == nodeA));
或比较Value
属性:
var trueOne = nodeCollection.Where(n => n.Value == nodeA.Value);
问题是SqlBoolean == SqlBoolean
返回SqlBoolean
而不是bool
,因为相等操作符被覆盖。
您可以创建一个扩展方法来包装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);