2014-07-01 38 views
2

我有一個日曆應用程序,您可以在其中選擇產品的各種組合 - 服務熄滅並根據日曆日期範圍獲取可用日期。如果所選產品在特定日期可用,日期僅爲「可用」。獲取包含所有選定產品的日期

class SelectedProduct 
{ 
    public int ID { get; set; } 
    public int Qty { get; set; } 
} 

class AvailableInventory 
{ 
    public int ID { get; set; } 
    public DateTime Date { get; set; } 
} 


// List of selected products from user 
List<SelectedProduct> SelectedProducts; 

// populated from service with all dates for all products 
List<AvailableInventory> AvailableInventory; 

我希望能夠說出包含所選產品中所有ID的庫存的每個日期的可用庫存清單。

一個可能的解決方案。這是(非工作)pusdo代碼,我只是不知道LINQ不夠好,得到它的權利

var results = List<AvailableInventory>(); 

foreach (var group in AvailableInventory.GroupBy(x => x.Date)) 
{ 
    if (group.Contains(ALL ID's in SelectedProducts) 
    { 
     results.AddRange(group); 
    } 

} 
+0

OK,你有什麼已經嘗試過?你應該展示你的努力,而不是要求我們爲你寫代碼。 – MarcinJuraszek

+0

哈哈一句話 - 我可以用一個非常醜陋的循環完成上述操作 - 正在尋找更優雅的LINQ解決方案 - 將會發布一秒。 – McCheeseIt

+0

是'AvailableInventory'中的'Date'屬性是'int'還是'Date'? –

回答

1

按日期對庫存進行分組(忽略日期部分),然後僅選擇包含所有選定產品ID的組,最後爲匹配組選擇所有可用庫存。

var results = 
    AvailableInventory.GroupBy(i => i.Date.Date) 
         .Where(g => !SelectedProducts.Select(p => p.ID) 
                .Except(g.Select(i => i.ID)) 
                .Any()) 
         .SelectMany(g => g); 

結果是AvailableInventory的集合。

0

我認爲這是你在找什麼。試試這個

var result = AvailableInventory.Where(i => SelectedProducts.Any(x => x.ID == i.ID)).GroupBy(o => o.Date) 
      .Select(g => g.First()).ToList(); 

這是測試數據我使用了基於類定義爲AvailableInventorySelectedProduct

// List of selected products from user 
List<SelectedProduct> SelectedProducts = new List<SelectedProduct> { 
    new SelectedProduct { ID = 1, Qty = 2 }, 
    new SelectedProduct { ID = 2, Qty = 4 }, 
    new SelectedProduct { ID = 5, Qty = 10 } 
}; 

// populated from service with all dates for all products 
List<AvailableInventory> AvailableInventory = new List<AvailableInventory> { 
    new AvailableInventory { ID = 1, Date = new DateTime(2014, 04, 01) }, 
    new AvailableInventory { ID = 2, Date = new DateTime(2014, 04, 02) }, 
    new AvailableInventory { ID = 3, Date = new DateTime(2014, 04, 02) }, 
    new AvailableInventory { ID = 4, Date = new DateTime(2014, 04, 10) }, 
    new AvailableInventory { ID = 5, Date = new DateTime(2014, 04, 10) } 
}; 

這應該給你只ID = 1, ID = 2 and ID = 5的記錄,因爲這是兩個AvailableInventorySelectedProducts之間有什麼共同名單。

0

它會幫助,如果你真的試圖的東西。

有鑑於此:

List<SelectedProduct> SelectedProducts ; 
List<AvailableInventory> AvailableInventory ; 

像這樣的東西可能會得到你想要的東西:

int[] DatesWithAllSelectedProductsAvailable = 
     AvailableInventory 
     .GroupBy(x => x.Date) 
     .Where (g => g.All(x => SelectedProducts.Any(p => p.ID == x.ID))) 
     .Select(x => x.Key) 
     .Distinct() 
     .OrderBy(x => x) 
     .ToArray() 
     ; 
+0

相信我,我試過了......這種超過我頭腦的嘶嘶聲與747相提並論。 – McCheeseIt

1

您可以通過組日期,然後過濾掉不具有所有SelectedProducts組。

// List of selected products from user 
List<SelectedProduct> SelectedProducts = new List<SelectedProduct> { 
    new SelectedProduct { ID = 1, Qty = 1 }, 
    new SelectedProduct { ID = 2, Qty = 2 }, 
}; 


// populated from service with all dates for all products 
List<AvailableInventory> AvailableInventory = new List<AvailableInventory> { 
    new AvailableInventory { ID = 1, Date = new DateTime(2014, 04, 11) }, 
    new AvailableInventory { ID = 2, Date = new DateTime(2014, 04, 11) }, 
    new AvailableInventory { ID = 1, Date = new DateTime(2014, 04, 12) }, 
    new AvailableInventory { ID = 2, Date = new DateTime(2014, 04, 13) }, 
    new AvailableInventory { ID = 1, Date = new DateTime(2014, 04, 14) }, 
    new AvailableInventory { ID = 2, Date = new DateTime(2014, 04, 14) },     
}; 

var query = AvailableInventory.GroupBy(i => i.Date) 
    .Where(g => SelectedProducts.All(s => g.Any(i => i.ID == s.ID))); 

foreach(var group in query) 
{ 
    Console.WriteLine("Date: {0}", group.Key); 

    foreach(var inventory in group) 
    { 
     Console.WriteLine(" Available: {0}", inventory.ID); 
    } 
} 

這將輸出:

Date: 4/11/2014 12:00:00 AM 
    Available: 1 
    Available: 2 
Date: 4/14/2014 12:00:00 AM 
    Available: 1 
    Available: 2 
相關問題