2009-07-22 151 views
0

我對linq很陌生,很難創建一個查詢。 我有一個'Customers'表和'Orders'表,一對多的關係。 如何選擇那些在訂單描述中擁有「特殊」一詞的最早訂單的客戶?Linq查詢問題(一對多,子對象屬性過濾器)

如果最早的訂單不包含這個詞,客戶不應該在結果中。如果客戶沒有訂單,他不應該在結果中。換句話說,只有那些有訂單且最老的訂單中有'特殊'字樣的客戶應該在那裏。

我希望我很清楚,謝謝。

回答

3

公共靜態列表<客戶> SampleSelect(名單<客戶>客戶端)
{
       回報clients.Where(C = > c.Orders.Count &
                                                                          c.Orders.OrderBy(O = > o.Date)
                                                                                          .FirstOrDefault()。Description.Conta插件( 「特殊」))ToList()。
}

//固定排序,日Thnx瑞安Versaw

1

這是一個快速的猜測,推測我可以從你的問題。它可能會或可能不準確:

var dc = new MyDataContext();  
var qry = from customer in dc.Customers 
      where customer.Orders.Description.Contains("special") 
      && customer.Orders.OrderDate > myMinDate 
      && customer.Orders.OrderDate < myMaxDate 
      order by customer.Orders.OrderDate ascending 
      select customer; 

它應該返回通過的訂單日期,由最小和最大日期過濾排序Customer對象。如果您不想按日期過濾,則可以刪除這兩行。

期望客戶重複。如果您需要不重複,請添加一個group by子句。

祝你好運,報告它的效果如何。 :)

編輯:

謝謝,Randolpho,問題是,我沒有myMinDate和myMaxDate。我需要能夠檢查最舊訂單的描述。我覺得我應該使用類似於c.Orders.Where(x => x.OrderDate.Max())的地方,但不能正確地組成整個查詢。謝謝。 - 瓦倫丁·瓦西里耶夫

嗯......我不能,如果你想用最古老的秩序,從客戶,你要檢查描述或如果你想與最古老的訂單,客戶告訴在訂單描述中有「特殊」一詞。

如果你想用最古老的訂單的客戶,然後要檢查的描述,你應該做這樣的事情:

var qry = from customer in dc.Customers 
      order by customer.Orders.OrderDate ascending 
      select new 
      { 
      CustomerData = customer, 
      OrderDescription = customer.Orders.Description 
      }; 
var oldest = qry.First(); 
if(oldest.OrderDescription.Contains("special")) 
{ 
    // do something 
} 

在這種情況下,最古老的是,有兩個字段創建新的匿名類型, CustomerData包含具有最舊訂單的客戶,OrderDescription包含最早訂單的描述字段。

另一方面,您可能需要包含單詞「special」的最早訂單。在這種情況下,你應該做這樣的事情:

var qry = from customer in dc.Customers 
      where customer.Orders.Description.Contains("special") 
      order by customer.Orders.OrderDate ascending 
      select customer; 
var oldestCustomerWithSpecial = qry.First(); 

在這種情況下,與包含在描述中的「特殊」二字最早的記錄的客戶是在名爲oldestCustomerWithSpecial變量。

我不認爲在OrderDate上使用Max會幫助你。使用按日期TOP 1查詢的訂單幾乎總是更好。在查詢上調用First()會做到這一點。

+0

謝謝,Randolpho,問題是,我沒有myMinDate和myMaxDate。我需要能夠檢查最舊訂單的描述。我覺得我應該使用類似於c.Orders.Where(x => x.OrderDate.Max())的地方,但不能正確地組成整個查詢。謝謝。 – Valentin 2009-07-22 14:36:30

+0

我的情況是第一個。不幸的是,它不能編譯,我無法在這裏訪問OrderDate:由customer.Orders.OrderDate升序, ,因爲Orders是一個集合。 – Valentin 2009-07-22 16:06:46