Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# 如何重用带参数的LINQ Select表达式_C#_Linq_Lambda - Fatal编程技术网

C# 如何重用带参数的LINQ Select表达式

C# 如何重用带参数的LINQ Select表达式,c#,linq,lambda,C#,Linq,Lambda,我编写了一个LINQ查询,并为Select子句创建了一个表达式来重用它 我的问题是这样的 DataContext.Single.Select(SearchSelector).ToList(); 其中作为搜索选择器定义为 private Expression<Func<Singles, SearchSingles>> SearchSelector = s => new SearchSingles { }; private Express

我编写了一个LINQ查询,并为Select子句创建了一个表达式来重用它

我的问题是这样的

 DataContext.Single.Select(SearchSelector).ToList();
其中作为搜索选择器定义为

 private Expression<Func<Singles, SearchSingles>> SearchSelector = s =>
    new SearchSingles
    {
    };
private Expression SearchSelector=s=>
新单曲
{
};
上面的方法很好,但是如果我想使用两个输入参数呢?我将如何调用它

 private Expression<Func<Singles,string, SearchSingles>> SearchSelector = (s,y) =>
    new SearchSingles
    {
    };
private Expression SearchSelector=(s,y)=>
新单曲
{
};

不使用签名,将附加参数作为捕获值传递,怎么样?作为一个初始化的成员变量,它的使用可能是有限的,就像这样,但是如果您从某个辅助函数中赋值,而不是在类构造期间初始化它,您将拥有更大的权限

private Func<Singles, SearchSingles> SearchSelector = s =>
    new SearchSingles
    {
         someVal = capturedVariable,
         someOther = s.nonCapturedVar
    };
你可以有各种各样的乐趣


*编辑*删除对表达式的引用和澄清

使用一种方法创建给定特定字符串所需的表达式,而不是使用存储表达式的字段:

private static Expression<Func<Singles, SearchSingles>> CreateSearchSelector(
    string foo)
{
    return s =>
        new SearchSingles
        {
            Foo = foo,
        };
}

另一个参数应该来自哪里?您是否尝试过
Select(s=>SearchSelector(s,“此处为您的字符串”)
?参数假设来自需要在表达式内部使用的方法。上面显示语法errorMaybe
private Func SearchSelector=y=>s=>newsearchsingles{}
选择(SearchSelector(“此处为您的字符串”)
运气不好,似乎我无法像正常函数那样调用,它表示委托、方法或事件expectedWell我不使用EF,而且我没有主意,我已经投票支持您,所以也许其他人可以帮助您。语句lambdas不能与表达式一起使用。至于你的第一个选择,你希望从那个上下文中关闭什么变量?是的,我在复制/粘贴时对那个“表达式”保持沉默,只是在研究它是否必要。在第一种情况下,capturedVariable可以是工作成员函数的参数,如
private void DoIt(string capturedVariable){SearchSelector=s=>newsearchsingles{someVal=capturedVariable,someOther=s.nonCapturedVar};}
可能是这样的,但这不是你在回答中所说的。如果你真的证明了这一点,那么你就会有一个正确的答案。也就是说,您几乎肯定希望这样的方法使用该字符串返回表达式,而不是将其分配给字段。我不想限制想象力。我将在测试“表达式”的需要后进行编辑。然而,我尝试的方式不可能吗?具体来说,你想做什么?Servy的回答似乎解决了你的问题,但也许你的问题不够清楚。如果不想使用命名方法,可以应用他的方法,但不使用命名方法。例如,
DataContext.Single.Select(((Func)(y=>s=>newsearchsingles{Foo=y}))(“Foo”)).ToList()这与Servy的答案类似,但使用的是匿名方法,因此我不确定这是否是您试图解决的差异。@AmmarKhan您可以创建一个实际用于参数的表达式,当然。你在你的问题中创造了一个很好。如果要将其传递给某个需要使用该签名的表达式的对象,则无需执行任何操作。诀窍在于,
Select
需要的签名是固定的。无论您做什么,都必须解析为
Func
的委托。所以不管你怎么做。。。
private static Expression<Func<Singles, SearchSingles>> CreateSearchSelector(
    string foo)
{
    return s =>
        new SearchSingles
        {
            Foo = foo,
        };
}
DataContext.Single.Select(CreateSearchSelector("Foo")).ToList();