linq - получить самую последнюю связанную запись - PullRequest
0 голосов
/ 15 ноября 2011

Предполагая, что у меня есть Customer и Order объекты, где один Customer может иметь много Orders (поэтому класс Order имеет свойство CustomerId), и я хочу вернуть коллекцию всехCustomerAndMostRecentOrder объектов, которые определены следующим образом:

public class CustomerAndMostRecentOrder
{
  public Customer Customer { get; set; }
  public Order MostRecentOrder { get; set; }
}

Как мне написать запрос Linq, который делает это (я использую Linq для SQL)?

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

Вы можете использовать следующий запрос:

from c in customers
select new CustomerAndMostRecentOrder
    {
        Customer = c,
        MostRecentOrder = c.Orders.OrderByDescending(o => o.PurchaseDate).FirstOrDefault()
    };

Это будет использовать свойство навигации от клиента к заказу.MostRecentOrder берется путем упорядочения Orders для некоторого свойства DateTime и последующей загрузки первого.

1 голос
/ 15 ноября 2011
public class CustomerAndMostRecentOrder
{
    public CustomerAndMostRecentOrder(Customer customer, Order mostRecentOrder)
    {
        Customer = customer;
        MostRecentOrder = mostRecentOrder;
    }

    public Customer Customer { get; set; }
    public Order MostRecentOrder { get; set; }
}

public class Order
{
}


public class Customer
{
    public IEnumerable<Order> GetOrders()
    {

    }
}


public static class UsageClass
{

    public static void Sample(IEnumerable<Customer> allCustomers)
    {
        IEnumerable<CustomerAndMostRecentOrder> customerAndMostRecentOrders =
            allCustomers.Select(customer => new CustomerAndMostRecentOrder(customer, customer.GetOrders().Last()));
    }

}
1 голос
/ 15 ноября 2011

Вам потребуется дата CreatedDate в таблице Order, чтобы получить самый последний заказ. Затем, чтобы получить объект CustomerAndMostRecentOrder, выполните следующий запрос:

from c in customers
join o in orders on c.ID equals o.CustomerID into co
select new CustomerAndMostRecentOrder
{
    Customer = c,
    MostRecentOrder = co.OrderByDescending(o => o.CreatedDate).FirstOrDefault()
}
0 голосов
/ 15 ноября 2011

В качестве другой альтернативы, вы можете захотеть взглянуть на DataLoadOptions.AssociateWith, обсужденный на http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.associatewith.aspx. Просто установите ваши требования к контексту, и вам не нужно беспокоиться о фильтрации дочерних элементов на уровне запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...