2011-06-22 103 views
1

我正在使用LinqPad與實體框架4模型和MS SQL 2008數據庫。Linq到實體返回所有外部實體和一個或沒有關聯實體

假設我們有一個Customer實體與Purchase.CustomerID的外鍵具有購買關聯。

以下linq產生一個ObjectQuery<Customer>Purchases協會EntityCollection<Purchase>

from c in Customers.Include("Purchases") 
select c 

現在我想所有客戶只是最近購買。如果沒有購買,那麼我希望Purchases集合爲空。

我需要類似下面的內容,但是維護實體和關聯。我想獲得全部集合限於0或1次購買的客戶。

from c in Customers 
from p in c.Purchases.Where(p => p.PurchaseDate == c.Purchases.Max(m => m.PurchaseDate).DefaultIfEmpty() 
select new { CustomerID = c.CustomerID, PurchaseID = (int?)p.PurchaseID } 

在我的服務,我返回List<Customer>,所以我覺得我需要保持Customer實體,從LINQ查詢返回Purchases關聯。

使用案例:

var customers = CustomerService.GetCustomersAndMostRecentOrder(); 
foreach (Customer c in customers) { 
    Console.WriteLine(c.Lastname + ":" + 
        c.Purchases.Count() == 0 ? "None" : c.Purchases[0].PurchaseOrder); 
} 

感謝您的見解。

回答

0

你需要做查詢的一部分使用LINQ到實體,比使用LINQ到對象,像這樣的休息:

var query = (from c in Customers 
      select new 
      { 
       Customer = c, 
       Purchase = c.Purchases.OrderByDescending(p => p.PurchaseDate).FirstOrDefault() 
      }) 
      .AsEnumerable() 
      .Select(c => new Customer() 
         { 
          CustomerID = c.CustomerID, 
          CustomerProperty2 = c.CustomerProperty2, 
          CustomerProperty3 = c.CustomerProperty3, 
          ..., 
          Purchases = new Purchase[] { c.Purchase } 
         } 
        ); 
+0

我想這一點,但我在輸出中得到0購買。 - 在'採購= c.Purchases'上增加'as EntityCollection ' – GoClimbColorado

+0

嘗試更改Take(1)到FirstOrDefault() – Aducci

+0

沒有將其更改回採購實例而不是採購集合。還嘗試了DefaultIfEmpty()... get 0 Purchase。 – GoClimbColorado