免責事項:System.Linq.Expressionsの式を使用して問題を解決しましたが、まだより良い/簡単な方法を探しています。
次の状況を検討してください。
var query =
from c in db.Customers
where (c.ContactFirstName.Contains("BlackListed") ||
c.ContactLastName.Contains("BlackListed") ||
c.Address.Contains("BlackListed"))
select c;
ブラックリストに登録されている用語に対してチェックする必要がある列/属性は、実行時にのみ使用できます。この動的なwhere句を生成するにはどうすればよいですか?
さらに複雑なのは、Queryableコレクション(上記のdb.Customers)が「Customer」(たとえば「Person」)の基本クラスのQueryableに型指定されるため、上記のようにc.Addressを書き込むことはオプションではありません。
@Geoffには、Dynamic LINQを正当化する最良のオプションがあります。
Lambdaを使用して実行時にクエリを構築する方法を使用する場合は、PredicateBuilder( http://www.albahari.com/nutshell/predicatebuilder.aspx )を使用して次のようなものを作成することをお勧めします。
Expression<Fun<T,bool>> pred = null; //delcare the predicate to start with. Note - I don't know your type so I just used T
if(blacklistFirstName){
pred = p => p.ContactFirstName.Contains("Blacklisted");
}
if(blacklistLastName){
if(pred == null){
pred = p => p.ContactLastName.Contains("Blacklisted"); //if it doesn't exist just assign it
}else{
pred = pred.And(p => p.ContactLastName.Contains("Blacklisted"); //otherwise we add it as an And clause
}
}
含めるすべての列についても同様です。クエリに到達すると、次のようなものが必要になります。
var results = db.Customers.Where(pred).Select(c => c);
これを使用して、約20の異なるオプションがある場所を検索するためのLINQの構築を行い、本当に良いSQLを生成しました。