Повторное использование части запроса с объединениями

Мне нужно реализовать 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,

Другие вопросы по тегам