2017-05-05 78 views
0

我們有一個LINQ METHOD語法查詢的重複部分。這是一個人爲的例子。附加到查詢的選擇部分

IQueryable<orders> query = _context.Set<orders>(); 

    var result = query.Select(p => new{ 
     REMAINING = p.qtyOrdered + p.alreadysent, 
     AWATING = p.qtyOrdered + p.alreadysent   
    }).ToList(); 

所以我們正在努力解決的東西放在一個方法,然後調用這一點,得到某種結果的重複部分。所以像這樣....

private IQueryable WhatsLeft() 
    { 
     IQueryable<orders> query = _context.Set<orders>(); 
     return query.Select(p => new{p.qtyOrdered + p.alreadysent}); 
    } 

    IQueryable<orders> query = _context.Set<orders>(); 

    var result = query.Select(p => new{ 
     REMAINING = WhatsLeft(), 
     AWATING = WhatsLeft()   
    }).ToList(); 

這是所有可能的,如果有的話,任何人都可以給我一些簡短的建議,我會如何實現這一點。

+0

您是否正在查找訂單清單,剩餘/等候每個訂單,或者只是這2個訂單的所有訂單? –

+0

可能看看'LINQ表達式' – Rahul

+3

爲什麼你甚至需要剩餘和等待屬性,如果它們是相同的? –

回答

2

難道你不會直接將Order對象直接傳遞給新函數嗎?

private int Total(Order order) 
{ 
    return order.qtyOrdered + order.alreadySent; 
} 

IQueryable<orders> query = _context.Set<orders>(); 

var result = query.Select(p => new{ 
    REMAINING = Total(p), 
    AWATING = Total(p)   
}).ToList(); 

如果我明白你是正確的。我無法記住我的頭頂Linq到sql等如何處理函數,將它們解釋爲SQL函數。也許你可以試試看。

另外,減少功能的複雜性(便於L2S轉換)可以使參數顆粒狀的功能,如:

private int Total(int left, int right) 
{ 
    return left + right; 
} 

然後撥打電話更象:

var result = query.Select(p => new{ 
    REMAINING = Total(p.qtyOrdered, p.alreadysent), 
    AWATING = Total(p.qtyOrdered, p.alreadysent) 
}).ToList(); 

更新:

你有沒有想過預先查詢計算?

var result = query.Select(c => c.qtyOrdered + c.alreadysent).Select(p => new { 
    REMAINING = p, 
    AWAITING = p 
}).ToList(); 
+0

DB無法執行函數,但EF可以在運行時將方法調用表達式樹轉換爲相關的sql查詢 –

+0

我已更新答案,請告訴我這是否更符合您的要求。 – ajb101