2017-12-13 12 views
0

私は2つのテーブルを持っています。LinqでJoin ByとMinを使用する方法

注文:

  • ID
  • のProductID
  • DeliveryDate

製品:

  • ID
  • 名前
  • 説明

私は早い配達日時ですべての製品のリストを取得したいです。

次のSQLを使用して正しいデータを取得しています。 これは、最も早い納期のすべての製品のリストを私に提供します。

SELECT 
    p.Name, p.Description, min(o.DeliveryDate) 
FROM Product p 
JOIN Order o 
On o.ProductID = p.ID 
Group By p.ID; 

私はLinqを使用して書き込みしようとしましたが、何かがありません。 このクエリを書く方法を特定できません。

私は相対的なスタックオーバーフローソリューションを試しましたが、私の場合は助けになりませんでした。

私のLINQのは、次のとおりです。

await (from p in dbContext.Product 
    join o in dbContext.Order 
    on o.ProductID equals p.ID 
    select new 
    { 
     p.ID, 
     p.Name, 
     p.Description, 
     o.DeliveryDate 
    }).GroupBy(g => g.ID).ToListAsync(); 

それは後のデータで参加して、グループを私に与えます。製品の最短出荷日を取得するにはどこでLinqにMinを置く必要がありますか?

+0

LINQコードは正しいですか:PersonテーブルとOrderテーブルを結合していますか? –

+0

Shit !!その私の悪い。私はそれを編集しました。 –

答えて

1

ナビゲーションプロパティProduct.Ordersがあるとします。そうでない場合は、コードに追加することを強くお勧めします。そのプロパティを持って、これはあなたが望むものを達成します:

from p in dbContext.Product 
select new 
{ 
    p.ID, 
    p.Name, 
    p.Description, 
    MinDeliveryDate = (DateTime?)o.Orders.Min(o => o.DeliveryDate) 
} 

DateTime?へのキャストは、製品が注文を持っていないときに例外を防ぐためです。

本当にあなたがナビゲーションプロパティを持っていない何らかの理由と場合に使用できる、現時点ではそれを追加することはできません。

from p in dbContext.Product 
select new 
{ 
    p.ID, 
    p.Name, 
    p.Description, 
    MinDeliveryDate = (DateTime?)dbContext.Order 
              .Where(o => o.ProductID == p.ID) 
              .Min(o => o.DeliveryDate) 
} 

なおProductでクエリを開始し、参加しないことにより、 Orderの場合、グループ化は必要ありません。

+0

ありがとうございます@GertArnoldは私のために働く! :) –

1

私はいくつかのクラスを使用してデータベースを扱いましたが、これは機能しますか?あなたは "のOrderBy" LINQメソッドを使用することができ、あなたのグループを注文しようとしている場合

class Product 
{ 
    public int ID; 
    public string Name; 
    public string Description; 
} 

class Order 
{ 
    public int ProductID; 
    public DateTime DeliveryDate; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    Product[] proTestData = new Product[] 
    { 
     new Product() {ID=1, Name="Widget", Description="Banded bulbous snarfblat"}, 
     new Product() {ID=2, Name="Gadget", Description="Hitchhiker's guide to the galaxy"} 
    }; 
    Order[] ordTestData = new Order[] 
    { 
     new Order() {ProductID=1, DeliveryDate=new DateTime(2017,12,14)}, 
     new Order() {ProductID=1, DeliveryDate=new DateTime(2017,12,20)}, 
     new Order() {ProductID=2, DeliveryDate=new DateTime(2017,12,23)}, 
     new Order() {ProductID=2, DeliveryDate=new DateTime(2017,12,22)}, 
     new Order() {ProductID=2, DeliveryDate=new DateTime(2017,12,21)}, 
     new Order() {ProductID=1, DeliveryDate=new DateTime(2017,12,18)} 
    }; 

    var rows = 
     (from p in proTestData 
     join o in ordTestData 
     on p.ID equals o.ProductID 
     group o.DeliveryDate by p into grp 
     select new { 
      grp.Key.ID, 
      grp.Key.Name, 
      grp.Key.Description, 
      minDate = grp.Min()} 
     ).ToList(); 

    foreach (var row in rows) 
    { 
     Console.WriteLine("{0}: {1}", row.Name, row.minDate); 
    } 
    } 
} 

出力は

Widget: 12/14/2017 12:00:00 AM 
Gadget: 12/21/2017 12:00:00 AM 
0

です。

。の後に次を適用します。GroupBy()

.OrderBy(group => group.First().DeliveryDate).ToListAsync(); 
関連する問題