2009-07-22 6 views
0

私はlinqには新しく、クエリを作成するのに苦労しています。 「Customers」テーブルと「Orders」テーブルが1対多の関係にあります。 説明の順序が「特別」という単語で最も古い注文を持つ顧客を選択するにはどうすればよいですか?Linqクエリの質問(1対多、子オブジェクトのプロパティフィルタ)

最も古い注文にこの単語が含まれていない場合、顧客は結果に含まれるべきではありません。顧客が注文していない場合は、結果にならないようにしてください。言い換えれば、注文があり、最も古い注文に「特別な」という単語がある顧客のみがそこにいるはずです。

私は明確でありがとうと思います。

答えて

3

パブリック静的リスト<クライアント> SampleSelect(一覧<クライアント>クライアント)
{
       リターンclients.Where(C = > > c.Orders.Count 0 & &
                                                                          c.Orders.OrderBy(O = > o.Date)
                                                                                          .FirstOrDefault()。Description.Conta ins( "Special"))。ToList();ライアンVersaw

+0

これは、降順の代わりに昇順を並べる必要があります。 –

+0

はい、それは軽微ですが、アルゴリズムは正しいですが、それはより重要です。 – Valentin

+0

ええ、私はそれがマイナーなことを知っています - それが私がコメントして、それを投票した理由です:) –

1

これはあなたの質問から私ができることを外挿することによって簡単に推測されます。それは、あるいは正確でない場合があります:それは最小と最大の日付によってフィルタリング彼らの注文日、順Customerオブジェクトを返す必要があり

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; 

。これらの2行は、日付でフィルタリングしたくない場合は削除できます。

お客様には繰り返しを期待してください。非繰り返しが必要な場合は、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 
} 

を、最も古い2つのフィールドを持つ新しい匿名型です、最も古い注文の顧客を含むCustomerDataと、最も古い注文の説明フィールドを含むOrderDescriptionとを含む。

一方、「特別」という語を含む最も古い注文が必要な場合があります。その場合、あなたはこのような何か行う必要があります。このシナリオでは

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

おかげへのthnx
}

//固定順序は、Randolphoは、問題は、私はmyMinDateとmyMaxDateを持っていないということです。私は最も古い注文の説明を調べることができる必要があります。私はどこでもc.Orders.Where(x => x.OrderDate.Max())のようなものを使うべきだと思っていますが、クエリ全体を正しく構成することはできません。ありがとう。 – Valentin

+0

私の場合は最初のケースです。残念なことに、コンパイルされません。OrderDateにアクセスすることはできません。顧客の注文。注文。注文日の昇順、 注文はコレクションです。 – Valentin