如何重载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是不可取的。

如何重载Linq's Where子句来接受SqlBoolean

您必须将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);