簡體   English   中英

使用可選搜索子句執行LINQ查詢

[英]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.

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