2012-05-08 2 views
2

Я пытаюсь динамически строить дерево выражений, которое эффективно запрашивает источник данных, используя запрос. Запрос я пытаюсь повторить этоДерево выражений вложенных weshes

Countries.Where(y => Countries 
         .Where(x => 
          x.CountryLanguage.Any(b => b.CountryID == 73) && 
          x.CountryLanguage.Any(b => b.CountryID == 150)) 
         .Select(z => z.ShortCode) 
         .Contains(y.ShortCode)) 

Я перепробовал много способов сделать это, но это моя последняя попытка:

public void AddContainsWhereClause(IQueryable<T> objectSet, string predicateIdentifier) 
{ 
    ParameterExpression pe = Expression.Parameter(typeof(T), predicateIdentifier); 

    Expression expInner = Expression.Call(
     typeof(Queryable), 
     "Where", 
     new Type[] { typeof(T) }, 
     objectSet.Expression, 
     Expression.Lambda<Func<T, bool>>(rootExperession, resultExpression)); 

    Expression expOuter = Expression.Call(
     typeof(Queryable), 
     "Where", 
     new Type[] { typeof(T) }, 
     objectSet.Expression, 
     Expression.Lambda<Func<T, bool>>(expInner, pe)); 

} 

NB rootExpression является:

x => x.CountryLanguage.Any(b => b.CountryID == 73) && 
    x.CountryLanguage.Any(b => b.CountryID == 150) 

Но это возвращает:

[ApplicationFramework.LIN QBuilder.tests.Country] 'не может использоваться для возвращаемого типа' System.Boolean '

Кто-нибудь знает, что я делаю неправильно?

ответ

0

Я предполагаю, что вам нужна функция лямбда, чтобы эмулировать предикатный компонент вашего вызова Where.

A где предложение должно быть типа Func<TSource, bool>, но вы звоните Queryable.Where, который фактически возвращает IEnumerable.

Скорее, что спуск по пути дерева выражений, который может быть довольно сложным и трудноподдерживаемым, является вашей реальной проблемой только для того, чтобы вам нужно было выбрать список стран, которые поддерживают языки списка поставляемых стран?

int[] requiredCountryIds = {73, 150}; 

// Select countries which contain all required country IDs in their CountryLanguage set 
var resultSet = 
    countries.Where(
     y => requiredCountryIds.All(requiredCountryId => y.CountryLanguage.Any(b => b.CountryId == requiredCountryId))); 
Смежные вопросы