【问题标题】:Encapsulating LINQ select statement封装 LINQ 选择语句
【发布时间】:2008-12-10 18:18:36
【问题描述】:

我有如下所示的 LINQ 语句:

return ( from c in customers select new ClientEntity() { Name = c.Name, ... });

我希望能够将选择抽象为自己的方法,以便我可以有不同的“映射”选项。我的方法需要返回什么?

本质上,我希望我的 LINQ 查询看起来像这样:

return ( from c in customers select new Mapper(c));

编辑:

这是针对 LINQ to SQL 的。

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    现在我注意到它是 Linq to SQL 的新答案... :)

    如果您查看适用于 IQueryable<T> 的 Select 版本,则不需要 Func<In, Out>。相反,它需要一个Expression<Func<In, Out>>。编译器知道如何从 lambda 生成这样的东西,这就是正常代码编译的原因。

    因此,要通过将各种选择映射函数传递给 Select 来准备好使用它们,您可以像这样声明它们:

    private static readonly Expression<Func<CustomerInfo, string>> GetName = c => c.Name;
    
    private static readonly Expression<Func<CustomerInfo, ClientEntity>> GetEntity = c => new ClientEntity { Name = c.Name, ... };
    

    然后你会像这样使用它们:

    var names = customers.Select(GetName);
    
    var entities = customers.Select(GetEntity);
    

    【讨论】:

    • 在使用了您的解决方案和 bdukes 之后,我必须说您的解决方案更好,因为它能够解析表达式并实际构建 SQL。 bdukes' 带来了所有的结果,然后在内存中应用了其他子句。
    【解决方案2】:

    您可能必须使用链式方法而不是使用 LINQ 语法,然后您将能够传入您指定的各种 Expression&lt;Func&lt;TSource, TResult&gt;&gt; 值中的任何一个:

    Expression<Func<CustomerTable, Customer>> someMappingExpression = c => new Customer { Name = c.Name };
    return context.CustomerTable.Select(someMappingExpression);
    

    更新: Select 采用 Func,而不是 Expression
    更新: Select 函数应该使用的确实采用Expression&lt;Func&gt;,而不仅仅是Func

    【讨论】:

    • 本例中的代码示例是语法错误,不是吗?此外,Linq to SQL 的注释“选择采用 FUnc,而不是表达式”也不正确。
    【解决方案3】:

    这是用于 linq to objects 的吗?或者对于一个 linq to ?

    因为 ... select new Mapper(c),要求 'c' 已经物化为对象,然后传递给 Mapper() CTor。 (因为 'c' 在 db 级别未知,仅在 .NET 级别)

    【讨论】:

      【解决方案4】:

      顺便说一句:仅当您想在单独的查询子句(例如 Select)中使用代码的“分解”部分时,此处描述的解决方案才有效。如果你想把它作为一个子句的一部分来做其他事情(也许返回带有其他信息的匿名类型),你需要使用 Expression.Xyz 动态构建整个表达式树strong> 方法。

      或者,您可以使用我在此处描述的嵌入 lambda 表达式的技巧:

      【讨论】:

        猜你喜欢
        • 2012-01-12
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        相关资源
        最近更新 更多