2017-05-05 59 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