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

而且對我來說,不適合將所有選擇表達式。我想分享一些表情並在不同的地方使用它。 –