C# 我能明智地使用没有集合的表达式吗?
曾经有几次,我想与EF LINQ命令共享一些功能,在处理内存中的单个对象时,也可以在不同的地方共享这些功能。能够在这两个实例中共享一个表达式可能会很有用,因为它不会复制逻辑 下面我有一个虚拟示例,其中我故意在单个对象上使用表达式,但我想知道是否有一种合理、简洁和干净的方法可以直接将表达式应用于对象,或者表达式设计为在LINQ集合情况下显式使用C# 我能明智地使用没有集合的表达式吗?,c#,linq,expression,C#,Linq,Expression,曾经有几次,我想与EF LINQ命令共享一些功能,在处理内存中的单个对象时,也可以在不同的地方共享这些功能。能够在这两个实例中共享一个表达式可能会很有用,因为它不会复制逻辑 下面我有一个虚拟示例,其中我故意在单个对象上使用表达式,但我想知道是否有一种合理、简洁和干净的方法可以直接将表达式应用于对象,或者表达式设计为在LINQ集合情况下显式使用 //Silly non practical example to show LINQ working public static void Main(st
//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;
//显示LINQ工作的愚蠢的非实际示例
公共静态void Main(字符串[]args)
{
常量字符串testString=“Test”;
var length=testString.SingleSelect(GetCount);
控制台写入线(长度);
}
私有静态T2 SingleSelect(此T1输入,表达式)
{
返回新列表{input}.AsQueryable().Select(expression).First();
}
私有静态表达式GetCount=>input=>input.Length;
您可以使用
private static T2 SingleSelect<T1, T2>(this T1 input, Expression<Func<T1, T2>> expression)
{
return expression.Compile()(input);
}
private static T2 SingleSelect(此T1输入,表达式)
{
返回表达式.Compile()(输入);
}
但是EF LINQ会有所不同-EF LINQ将在数据库端执行大部分逻辑(例如,在SQL Server上)。但是这里的
expression.Compile()(…)
将在您的程序端执行,即CLR的.net代码。使用表达式仅直接将其应用于对象的想法听起来很奇怪。据我所知,当你对发生的方式和内容感兴趣时,会使用表达式,但直接应用意味着你只对结果感兴趣,因此表达式的附加功能似乎被浪费了。这就是我得到的感觉,但我希望有一种方法,我可以明智地/正确地实现它,这样我就可以在执行EF db集合上的操作时清晰地共享一段逻辑,以及内存中相同模型的单个对象。也许有两个字段,一个用于实际函数(在单个对象上正常使用),另一个在大集合上执行EF操作时带有包装函数的表达式是一个不错的选择,我不确定。投票结束作为dupe,其中有大量答案涵盖了表达式有多棒。这相当干净,谢谢。在这个例子中,我处理的是已经在内存中的单个对象,以及通常处理基元字段的表达式(也应该在内存中),我认为尽管将LINQ丢失给SQL,但从性能角度来看,我在这里还是可以的。主要是我不想复制逻辑。@Geesh\u所以请确保只调用一次.Compile()
,然后缓存结果。