Что не так с этим созданием выражения linq (с использованием содержит) - PullRequest
2 голосов
/ 01 августа 2011

Я пытаюсь динамически создать выражение linq с оператором содержимого.

После прочтения нескольких сообщений, связанных с этой темой, я пришел к следующему коду, который позволяет мне выполнять «содержит» какоценка:

internal static Expression<Func<TEntity, bool>> StringContains<TEntity>(string propertyName, string subString)
{
    MethodInfo contains = typeof(JsonLinqParser_Paser).GetMethod("Like");
    var param = Expression.Parameter(typeof(TEntity));
    var body = Expression.Call(contains, Expression.Property(param, propertyName), Expression.Constant(subString, typeof(string)));

    var lambda = Expression.Lambda<Func<TEntity, bool>>(body, param);

    return lambda;
}
public static bool Like(string a, string b)
{
    return a.Contains(b);
}

И это называется так:

var expression = Expression.Lambda<Func<TEntity, bool>>(StringContains<TEntity>("FIPSCO_STR", _myStringValue), param);

Однако во время выполнения я получаю сообщение об ошибке:

Выражениетип 'System.Func`2 [DAL.BestAvailableFIP, System.Boolean]' нельзя использовать для типа возвращаемого значения 'System.Boolean'

, где "DAL.BestAvailableFIP" - это тип "TEntity".

Я уверен, что все это связано с моим недостатком знаний о лямбда-выражениях.Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

8 голосов
/ 01 августа 2011

StringContains уже возвращает LambdaExpression.

Не следует помещать его в другое лямбда-выражение.
Если вы хотите создать другое лямбда-выражение, которое его содержит, вы должны использовать его Body.

...