0

人を検索できるページがあります。すべての人のリストを取得するか、姓名などの特定の基準でフィルター処理することができます。

これまでのところ、この質問で詳しく説明されている手法を使用しようとしています。

だから私のコードは次のようになります

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 参照エラーが発生しますが、名と姓の両方が null の場合です。where句を削除すると、エラーが解消されます。

なぜこれがうまくいかないのでしょうか?C# は where 句の各部分の 2 番目の部分を評価しようとしますか? 短絡したORのせいではないはずですよね?

4

4 に答える 4

1

ToLower()代わりにignoreCaseを使用してusestring.compareを呼び出す必要はありません。

string.Compare(firstName, p.FirstName, true) 
于 2010-07-16T18:08:28.750 に答える
1

string.Equals を使用:

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 の問題が回避されるだけでなく、文字列比較タイプを指定する必要が生じます (これは良いことです)。つまり、大文字と小文字を区別しない比較を実行するときに、ローカルまたはインバリアント カルチャに固有の規則を使用するかどうかを指定します。

于 2010-07-17T02:06:07.677 に答える
0

trueステートメントの最初の部分が に評価され、評価の短絡が許可されないため、両方が null の場合は機能しません。同値規則を使用してステートメントを反転させてみませんか?

(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;}
}
于 2010-07-16T17:57:31.260 に答える
0

ToLower を呼び出す前に、null でないことを確認してください。

(firstname==null || (firstname!= null && firstname.ToLower()==p.FirstName.ToLower()))
于 2010-07-16T17:54:04.843 に答える