2016-10-23 3 views
0

Я пытаюсь создать предложение Contains в существующих списках свойств Func, но я не знаю, как его присоединить к ранее прошедшему списку свойств.Добавить Содержит к существующему объекту Func <T, object>

public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> properties, string queryPhrase) 
    { 
     var whereClauses = new List<Func<T, bool>>(); 

     foreach (var property in properties) 
     { 
      /// how to add Contains to existing property Func<T, object> ? 
      whereClauses.Add(property.Contains(queryPhrase)); 
     } 

     return whereClauses; 
    } 

Как это добавить? Я попытался использовать некоторый Expression.Call, но он не принимает параметр Func.

ответ

1

Если вы просто хотите, чтобы преобразовать каждый Func<T, object> в Func<T, bool>, если первый объект возврата FUNC отлиты в строку содержит queryPhrase вы можете сделать это:

public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase) 
{ 
    var whereClauses = new List<Func<T, bool>>(); 
    foreach (var func in funcs) 
    { 
     whereClauses.Add(o => func(o).ToString().Contains(queryPhrase)); 
    } 
    return whereClauses; 
} 

Или лучше с LINQ:

public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase) 
{ 
    return funcs.Select(func => new Func<T, bool>(o => func(o).ToString().Contains(queryPhrase)).ToList(); 
} 

Если объект reutrn фактически является списком, а не строкой, вы можете проверить, является ли queryPhrase частью списка аналогичным образом:

public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase) 
{ 
    return funcs.Select(func => new Func<T, bool>(o => ((List<string>)func(o)).Contains(queryPhrase)).ToList(); 
} 

Это не самая лучшая идея, чтобы ваш func возвращал tpye объект, если вы можете перенести его на реальный тип, который вы ожидаете, он спасет вас от избыточного кастинга.

+0

Это сработало, но у меня проблема с тем же для Linq Include.When я пытаюсь использовать 'query = query.Include (x => include (x));' where include is 'Func ' Я получаю сообщение об ошибке : Выражение Include path должно ссылаться на свойство навигации, определенное в типе. – Staly

+0

Вы не можете использовать этот подход с LINQ to Entities для фильтрации элементов в методе Include, пожалуйста, обратитесь к [this] (http://stackoverflow.com/questions/25629022/filtering-include-items-in-linq-and вопрос об альтернативах. – YuvShap

+0

Я имею в виду еще что-то. Я хочу добавить Include к моему запросу не строкой, а Func . Невозможно сделать это через объект. – Staly