簡體   English   中英

如何重載Linq的Where子句以接受SqlBoolean?

[英]How do you overload Linq's Where clause to accept SqlBoolean?

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。

您必須將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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM