Повторное использование части запроса с объединениями
Мне нужно реализовать 3 открытых метода, которые основаны на одном и том же начальном соединении. Будет ли работать решение, подобное описанному ниже?
Приведенный ниже код является примером, реальные вещи намного сложнее, поэтому я хочу использовать его повторно.
private Tuple<Customer,Order> GetCustomerOrders()
{
from c in customers
join o in orders
on c.customerid equals o.customerid
select Tuple.Create(c, o)
}
public MyCustomerOrder GetCustomerOrder(int customerId)
{
return (from co in GetCustomerOrders()
where co.Item1.customerid == customerId
select new MyCustomerOrder(co.Item1, co.Item2)).FirstOrDefault();
}
public IEnumerable<MyCustomerOrder> GetCustomerOrders()
{
return from co in GetCustomerOrders()
orderby co.Item1.Name
select new MyCustomerOrder(co.Item1, co.Item2);
}
Вопрос в том, нарушает ли кортеж запрос? Другими словами, закончится ли это в запросе SQL, который генерируется where co.Item1.customerid == customerId
?
1 ответ
Это действительно зависит от того, понимает ли LINQ to SQL смысл Tuple.Create
, Я подозреваю, что это происходит в.NET 4.0 - но единственный способ узнать это попробовать.
Это, безусловно, имеет концептуальный смысл, а составляемость является частью цели LINQ, поэтому я надеюсь, что она поддерживается. По сути это похоже на использование анонимного типа, за исключением того, что вы можете "экспортировать" информацию о типе из метода, что является точкой Tuple
,