【问题标题】:Linq in conjunction with custom generic extension method build error - An expression tree may not contain an assignment operator?Linq 结合自定义通用扩展方法构建错误 - 表达式树可能不包含赋值运算符?
【发布时间】:2012-02-22 15:05:19
【问题描述】:

我制作了一个通用扩展方法,它对对象执行操作并在此之后返回该对象:

    public static T Apply<T>(this T subject, Action<T> action)
    {
        action(subject);
        return subject;
    }

我无法在 EntityFramework Linq 查询中使用此扩展方法,原因是:

表达式树可能不包含赋值运算符

这是为什么?

Linq 查询:

var parents = from p in context.Parent
               join phr in context.Child on p.key equals phr.parentkey
               into pr
               select p.Apply(
                      x => x.Children = //The assignment operator that fails to build...
                      pr.ToDictionary(y => y.childkey, y => y.childname));

【问题讨论】:

    标签: linq generics extension-methods


    【解决方案1】:

    好吧,除了赋值运算符,您希望您的Apply 方法如何被翻译成SQL? Entity Framework 对此一无所知,也无法深入研究不透明的委托。

    我怀疑您真正需要做的是将要在数据库中执行的位与要在本地执行的位分开:

    var dbQuery =  from p in context.Parent
                   join phr in context.Child on p.key equals phr.parentkey into pr
                   select new { p, phr };
    
    var localQuery = dbQuery.AsEnumerable()
                            .Select(pair => /* whatever */);
    

    【讨论】:

    • 很公平,我认为我的部分的执行将在“本地”完成,不会被翻译成 SQL 查询......
    • @ReFocus:不,LINQ 的一半是你编写的 C# 代码被翻译成 SQL。您不希望通过获取所有数据然后在客户端加入它来执行连接,对吗?我代码中的 AsEnumerable 调用强制在 LINQ to Objects 中执行其余的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多