Могу ли я разумно использовать Expression без коллекции? - PullRequest
0 голосов
/ 30 октября 2019

Были времена, когда у меня была функциональность, которой я хотел поделиться с командами EF LINQ, а также в разных местах, когда имел дело только с одним объектом в памяти. Возможность совместного использования выражения в этих двух экземплярах может быть полезна, поскольку не дублирует логику.

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

//Silly non practical example to show LINQ working
public static void Main(string[] args)
{
    const string testString = "Test";
    var length = testString.SingleSelect(GetCount);
    Console.WriteLine(length);
}

private static T2 SingleSelect<T1, T2>(this T1 input, Expression<Func<T1, T2>> expression)
{
    return new List<T1> { input }.AsQueryable().Select(expression).First();
}

private static Expression<Func<string, int>> GetCount => input => input.Length;

1 Ответ

0 голосов
/ 30 октября 2019

Вы можете использовать

private static T2 SingleSelect<T1, T2>(this T1 input, Expression<Func<T1, T2>> expression)
{
    return expression.Compile()(input);
}

Но EF LINQ будет отличаться - EF LINQ будет выполнять большую часть логики на стороне БД (например, на SQL Server). Но здесь expression.Compile()(...) будет выполняться на стороне вашей программы, то есть .net-код CLR.

...