[英]Performing a LINQ query with optional search clauses
我有一個頁面,您可以在其中搜索人。 他們可以獲取所有人的列表,也可以通過某些條件(例如名字或姓氏)對其進行過濾。
到目前為止,我一直在嘗試使用此問題中詳述的技術。
所以我的代碼看起來像
string firstname=...
string lastname=...
var people=from p in People.All()
where (firstname==null || firstname.ToLower()==p.FirstName.ToLower()) &&
(lastname==null || lastname.ToLower()==p.LastName.ToLower())
select p;
我在建立查詢時收到null引用錯誤,但是當firstname和lastname均為null時。 刪除where子句可以消除該錯誤。
為什么這不起作用? C#是否嘗試評估where子句每個部分的第二部分? 難道不是因為短路或吧?
你不需要調用ToLower()
使用string.compare而不是ignoreCase
string.Compare(firstName, p.FirstName, true)
使用字符串。等於:
from p in People.All()
where (firstname == null || string.Equals (firstname, p.FirstName, StringComparison.InvariantCultureIgnoreCase)) &&
(lastname == null || string.Equals (lastname, p.LastName, StringComparison.InvariantCultureIgnoreCase))
select p
這不僅避免了null問題,而且還迫使您指定字符串比較類型(這是一件好事)。 換句話說,在執行不區分大小寫的比較時,您指定是使用特定於本地區域性還是不變區域性的規則。
調用ToLower之前,請確保它不為null:
(firstname==null || (firstname!= null && firstname.ToLower()==p.FirstName.ToLower()))
當兩者都為null時,它將不起作用,因為語句的第一部分將評估為true
,從而不允許評估的短路。 為什么不使用等效規則來翻轉語句?
(firstName != null && firstName.ToLower() == p.firstName.ToLower())
編輯:我寫了以下內容,並在LINQPad 4中成功運行了,沒有任何問題。 我假設對People.All()
的調用只是返回帶有完整記錄集的IQueryable<People>
? 也許在這里張貼您的例外情況文字,以便我們查看是否有您無意中錯過的東西?
void Main()
{
string a = null;
string b = null;
var peeps = new List<Person> {
new Person {
FirstName = "John",
LastName = "Connor"
},
new Person {
FirstName = "Sarah",
LastName = "Connor",
},
new Person {
FirstName = "Cletus",
LastName = "Handy"
}
};
var somePeeps = from p in peeps
where (a == null || a.ToLower() == p.FirstName.ToLower())
&& (b == null || b.ToLower() == p.LastName.ToLower())
select p;
somePeeps.Dump();
}
public class Person
{
public string FirstName { get; set;}
public string LastName { get; set;}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.