2013-07-22 4 views
2

Я пытаюсь загрузить данные на основе Dynamic where condition.Динамическое предложение where в LINQ?

string tempQry = string.Empty; 
if (!string.IsNullOrEmpty(cusid) && !string.IsNullOrEmpty(mktid)) 
    tempQry = "x=>x.MarketID==" + mktid + "&& x.MasterCustomerID==" + cusid; 
if (string.IsNullOrEmpty(cusid)) 
    tempQry = "x=>x.MarketID==" + mktid; 
if (string.IsNullOrEmpty(mktid)) 
    tempQry = "x=>x.MasterCustomerID==" + cusid; 

_lstOptInInterest = new LinkedList<OptInInterestArea>(
     (from a in _lstOptInInterest 
     join b in _marketoEntities.CustCommPreferences.Where(tempQry) 
     on new { CODE = a.Code, SUBCODE = a.SubCode } equals new { CODE = b.Option_Short_Name, SUBCODE = b.Option_Short_Subname } 
     into leftGroup 
     from b in leftGroup.DefaultIfEmpty() 
     select new OptInInterestArea() 
     { 
      Code = a.Code, 
      SubCode = a.SubCode, 
      SubCodeDescription = a.SubCodeDescription, 
      CodeDescription = a.CodeDescription, 
      PrevOptIn = b != null && b.OptedIn == true 
     }).ToList()); 

Дается компиляция Where(tempQry).

'System.Data.Entity.DbSet<Market.Data.CustCommPreference>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Queryable.Where<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)' has some invalid arguments

Как справиться с этим?

+0

Пожалуйста, правильно отформатируйте свой код. Трудно читать прямо сейчас. –

+0

Смотрите этот блог для своего ответа http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – Ehsan

+0

ошибка, которую вы видите, указывает на то, что вы используете EF, а не LINQ to SQL. Пожалуйста, исправьте свои теги, если это так. Если вы хотите использовать строки, попробуйте вместо этого использовать метод [ObjectQuery's Where] (http://msdn.microsoft.com/en-us/library/bb338811.aspx). –

ответ

8

Where ЖДЕТ условия в виде лямбды, а не строки, так что вы должны реорганизовать ваш код немного (только идея ниже):

IQueryable<CustCommPreference> query = _marketoEntities.CustCommPreferences.AsQueryable(); 
if (!string.IsNullOrEmpty(cusid)) 
    query = query.Where(x => x.MasterCustomerID == cusid); 
if (!string.IsNullOrEmpty(mktid)) 
    query = query.Where(x => x.MarketID == mktid); 

, а затем использовать его:

... 
join b in query 
... 
+0

@ В нем указано 'Невозможно неявно преобразовать тип 'System.Linq.IQueryable ' в 'System.Data.Entity.DbSet '. Явное преобразование существует (вы пропускаете листинг?) ' – James123

+0

@ James123, попробуйте явно указать тип. См. Обновленный ответ для примера. – Andrei

0

смотреть этот блог на Scott. Он должен помочь вам отсортировать вашу проблему.

0

Ошибка, которую вы видите, указывает на то, что вы используете EF, а не LINQ to SQL. Пожалуйста, исправьте свои теги, если это так. Если вы хотите использовать строки, подумайте об использовании метода ObjectQuery's Where вместо использования DBSet. Кроме того, вы можете построить весь запрос, используя EntitySQL.

Смежные вопросы