如何重用LINQ选择带参数的表达式

时间:2014-11-14 19:16:39

标签: c# linq lambda

我编写了一个LINQ查询,对于Select子句,我创建了一个Expression来重用它。

我的查询看起来像这样

 DataContext.Single.Select(SearchSelector).ToList();

搜索选择器定义为

的位置
 private Expression<Func<Singles, SearchSingles>> SearchSelector = s =>
    new SearchSingles
    {
    };

以上工作正常,但如果我想使用两个输入参数怎么办?我该如何调用它?

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

2 个答案:

答案 0 :(得分:3)

不是有一个存储表达式的字段,而是有一个方法可以创建给定特定字符串所需的表达式:

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

然后您可以像这样使用此方法:

DataContext.Single.Select(CreateSearchSelector("Foo")).ToList();

答案 1 :(得分:0)

如何单独留下签名并将其他参数作为捕获值传递?它可能作为初始化成员变量使用有限,就像这样,但如果你从一些工作者函数中分配,而不是在课程构建期间初始化它,你将拥有更多的权力。

private Func<Singles, SearchSingles> SearchSelector = s =>
    new SearchSingles
    {
         someVal = capturedVariable,
         someOther = s.nonCapturedVar
    };

如果capturedVariable是静态成员

,那将会有效

private Func<Singles, SearchSingles> SearchSelector = null;
private void WorkerFunction(string capturedVariable, bool capAgain, bool yetAgain)
{
  SearchSelector = s => {
    bool sample = capAgain;
    if (capturedTestVar)
        sample = yetAgain;
    return new SearchSingles
    {
         someVal = capturedVariable,
         someOther = s.nonCapturedVar,
         availability = sample
    };
  };
};

你可以有各种各样的乐趣

*编辑 *删除了对表达式的引用和说明