1

这里被简化代码实体框架执行表达

from oi in orderItems 
    group oiGrouped by ... 
    into orderItemsGroupedBySomething 
    select new 
    { 
     Key = orderItemsGroupedBySomething.Key, 

     Revenue = /*Here is some code that I want to extract to separate method, for example*/ 
      orderItemsGroupedBySomething.Sum(x => x.UnitPrice * x.Quantity)      
    } 

其实这是在我的情况更加复杂。但我认为这并不重要。我无法提取到orderItemsGroupedBySomething.Sum(x => x.UnitPrice * x.Quantity)的简单方法计算,因为它不是EntityFramework的已知方法。我试图把它表达,但我得到错误"The LINQ expression node type 'Invoke' is not supported in LINQ to Entities."我编译表达式之前在查询中使用它,我想因此我得到错误。我怎么解决这个问题?

+0

当你编译一个'表达>'你实际上得到了'Func键<>',而不是一个表达式树,实体框架可以检查和翻译。 –

+0

@LorentzVedeler是的,你是对的。有没有其他的方式来执行它? –

回答

1

我添加方法返回表达

public Expression<Func<OrderItem, decimal>> GetExpression() 
{ 
    return x => x.UnitPrice*x.Quantity; 
} 

然后我试图

from oi in orderItems 
    group oiGrouped by ... 
    into orderItemsGroupedBySomething 
    select new 
    { 
     Key = orderItemsGroupedBySomething.Key, 
     Revenue = orderItemsGroupedBySomething.Sum(GetExpression())      
    } 

不过,这并不与@LorentzVedeler回答这样的工作。因为orderItemsGroupedBySomething是类型为IGrouping的类型为Expression的参数不具有Sum方法。所以我试了

orderItemsGroupedBySomething.AsQueryable.Sum(GetExpression()) 

但是它会导致Internal .NET Framework Data Provider error 1025。问题是我在linq中调用了方法GetExpression()。为了解决这个问题,我把表达式放到局部变量中。结果

var expression = GetExpression(); 

from oi in orderItems 
     group oiGrouped by ... 
     into orderItemsGroupedBySomething 
     select new 
     { 
      Key = orderItemsGroupedBySomething.Key, 
      Revenue = orderItemsGroupedBySomething.AsQueryable.Sum(expression)      
     } 
+0

非常有帮助。奇怪的是,查询并不要求表达式是一个局部变量,除非该表达式在一个组的子查询中被使用。很奇怪。 – johnnywhoop

+0

@johnnywhoop,如果我正确地得到你,我认为有关局部变量与事实有关的事情,即查询可以不是LINQ到实体,也不是LINQ到SQL,它可以是例如LINQ来在这种情况下对象,它不需要局部变量 –

1

我不知道你是怎么一般需要它,但这样的事情应该工作:

void Main() 
{ 
    OrderItems.GroupBy(oi => oi.SomeProp).Select(GetExpression()); 
} 

public Expression<Func<IGrouping<KeyType, OrderItem>, dynamic>> GetExpression() 
{ 
    return (ig) => new { Key = ig.Key, Revenue = ig.Sum(x => x.UnitPrice * x.Quantity) }; 
} 

编辑:在分组的情况下,我可能会在一个代替返回一个元组匿名类型。

+0

谢谢。我无法使用lamda语法。我尝试了没有lamda语法和'选择GetExpression()'语句返回'表达式,动态>>'我可以在下一个查询中使用动态字段。 –

+0

而且对我来说,不适合将所有选择表达式。我想分享一些表情并在不同的地方使用它。 –