获取包含所有选定产品的日期

时间:2014-07-01 23:38:29

标签: c# linq

我有一个日历应用程序,您可以在其中选择各种产品组合 - 服务结束并根据日历日期范围获取可用日期。日期仅为"可用"如果所有选定的产品在特定日期可用。

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); 
    } 

}

4 个答案:

答案 0 :(得分: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

的集合

答案 1 :(得分: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

答案 2 :(得分: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列表之间的共同点。

答案 3 :(得分: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()
        ;