あなたが持っていると仮定するとIEnumerable<User>
、あなたはこれを行うことができます:
// Query for "Tom" being contained in any of the fields.
var query =
from user in users
where
(user.SamAccountName != null && user.SamAccountName.Contains("Tom")) ||
(user.EmailAddress != null && user.EmailAddress.Contains("Tom")) ||
(user.WorkPhone != null && user.WorkPhone.Contains("Tom")) ||
(user.MobilePhone != null && user.MobilePhone.Contains("Tom")) ||
(user.Office != null && user.Office.Contains("Tom"))
select user;
null
これらのフィールドのいずれかがnullの場合、のチェックは重要です。そうでない場合、クラスでContains
メソッドを呼び出すと、onを呼び出す文字列がないため、がスローされます。String
NullReferenceException
Contains
where
句は、クラスのWhere
拡張メソッドにマップするだけです(拡張メソッドがコンパイラによって認識されるように、宣言があることを確認してください)。Enumerable
using System.Linq;
ヌルチェックが過度または反復的であると感じた場合は、次のようにコードを絞り込むことができます。
// Generate your predicate.
Func<string, bool> checkContainsTom = s => s != null && s.Contains("Tom");
// Query.
var query =
from user in users
where
checkContainsTom(user.SamAccountName) ||
checkContainsTom(user.EmailAddress) ||
checkContainsTom(user.WorkPhone) ||
checkContainsTom(user.MobilePhone) ||
checkContainsTom(user.Office)
select user;
冗長ロジックをカプセル化するので、これは少し優れています。ロジックが変更された場合は、1か所で変更するだけで、すべてのチェックに適用されます。必要に応じて、ラムダ式を関数に置き換えてください。
その後、遅延実行を使用する場合は、を使用query
して列挙できます。マテリアライズドリスト(のように)で必要な場合は、次のように、クラスの拡張メソッドを呼び出すだけです。foreach
List<User>
ToList
Enumerable
IList<User> materializedResults = query.ToList();