Если по какой-либо причине словарь не требуется, я бы применил ваш метод поиска следующим образом:
public IQueryable<Product> Search( Func<Product, bool> isMatch )
{
DBDataContext dc = new DBDataContext();
return dc.Products.Where( isMatch ).AsQueryable();
}
Тогда вы бы использовали метод так:
Obj.Search( item => item.Property1 == "Hello" && item.Property2 == "World" );
Есть ли какая-то причина, по которой вы не можете этого сделать?
[Редактировать: добавлено AsQueryable ()]
[Редактировать: для динамического запроса с использованием строк]
Посмотрите здесь и посмотрите, поможет ли это. Я не использовал его, но, похоже, это то, что вы ищете:
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
Лично я, как правило, предпочел бы подход с типобезопасным выражением>, так как это даст вам ошибки времени компиляции ... но если нужны строки, то выглядит наилучшим способом сделать это.
Исходя из вышеуказанной ссылки, похоже, что вы должны сделать:
query = query.Where( String.Format("{0}={1}",dict.Key,dict.Value) );
[Редактировать: Пример строения строки]
Итак, одна из проблем заключается в том, что ваш sql-запрос будет заканчиваться символом AND в конце строки, но затем никаких условий после него ... так что, возможно, попытайтесь изменить это ... синтаксис может быть отключен немного, но должен быть прав:
public IQueryable<Product> Search(Dictionary<string, string> searchParams)
{
DBDataContext dc = new DBDataContext();
StringBuilder sQuery = new StringBuilder();
foreach (KeyValuePair<string, string> temp in searchParams)
{
if( sQuery.Length > 0 ) sQuery.Append(" AND ");
sQuery.AppendFormat("{0}={1}",temp.Key,temp.Value);
}
var query = dc.Products.Where(sQuery.ToString());
return query;
}
Это будет использовать только «И» в условиях после первого. Надеюсь, это поможет ...
К вашему сведению - это не по теме, но «почему», я использовал StringBuilder, заключается в том, что конкатенация строк так, как вы это делали, приводила к тому, что строка уничтожалась и новая строка создавалась в памяти 4 раза за цикл ... так изменилось в StringBuilder, так как это создаст буфер, который может быть заполнен и изменен только при необходимости.