Как создать дерево предикатных выражений, если участвующий член неизвестен во время компиляции?

У меня есть выражение, которое мне нужно написать для предиката:

.Where(e => SqlFunctions.StringConvert((double?) e.Number).Contains("6")))

Тем не менее, член, который я хочу проверить ( .Number в примере), неизвестен во время компиляции (это будет параметр string ).

Я пытался:

.Where(string.Format(
      "SqlFunctions.StringConvert((double?){0}).Contains(@0)", field), value);

Но это не сработало. Как создать предикат в этом случае?

0
nl ja de
e.Number - int. Мне нужен предикат, у меня нет поля имени
добавлено автор Mediator, источник
почему бы вам не начать с объяснения в предложениях того, чего вы пытаетесь достичь. Кроме того, не по теме, я ухватился за «почему вы пытаетесь что-либо».
добавлено автор Wim Ombelets, источник
Что происходит в настоящее время? Что не так с первой строкой, которая у вас есть ... например, почему вы пытаетесь что-либо ? Что такое проблема с первой строкой? И каков тип e.Number ?
добавлено автор Marc Gravell, источник

1 ответы

Если имя участника ( Number в этом примере) не известно во время компиляции, вам нужно будет построить дерево выражений вручную, например:

static Expression> BuildPredicate(
    string fieldName, string containsValue)
{
    var arg = Expression.Parameter(typeof(T), "e");
    var str = Expression.Call(typeof(SqlFunctions), "StringConvert", null,
        Expression.PropertyOrField(arg, fieldName));
    var contains = Expression.Call(str, "Contains", null,
        Expression.Constant(containsValue, typeof(string)));
    return Expression.Lambda>(contains, arg);
}

с использованием:

var predicate = BuildPredicate("Number", "6");
var filtered = data.Where(predicate);
1
добавлено
Отлично!
добавлено автор Mediator, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot