Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我能明智地使用没有集合的表达式吗?_C#_Linq_Expression - Fatal编程技术网

C# 我能明智地使用没有集合的表达式吗?

C# 我能明智地使用没有集合的表达式吗?,c#,linq,expression,C#,Linq,Expression,曾经有几次,我想与EF LINQ命令共享一些功能,在处理内存中的单个对象时,也可以在不同的地方共享这些功能。能够在这两个实例中共享一个表达式可能会很有用,因为它不会复制逻辑 下面我有一个虚拟示例,其中我故意在单个对象上使用表达式,但我想知道是否有一种合理、简洁和干净的方法可以直接将表达式应用于对象,或者表达式设计为在LINQ集合情况下显式使用 //Silly non practical example to show LINQ working public static void Main(st

曾经有几次,我想与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;
//显示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()
,然后缓存结果。