1

私の問題を要約しようとします:

私の製品テーブルにはさまざまな製品があり、productPrice テーブルには各製品の価格が時間とともに変化しています。

次のようなクラスに結果を取得しようとしています:

class ProductDictionary
{
    public int ProductId { get; set; }
    public IDictionary<int,double> YearValues { get; set; }
}

基本的に:次のようなものが必要です:(productId, Year, Value)

Product1, Dictionary( {2000, 10} {2001, 11},{2002, 13},{2003, 14},{2004, 15}}

Product2, Dictionary( {2000, 9} {2001, 11},{2002, 18},{2003, 16},{2004, 17} }

私は次のように書きましたが、それは私が望むものを与えません

var result = (from x in products
              join y in yearValuesForProduct2 on x.Id equals y.ProductId
              select new ProductDictionary
              {
                 ProductId = x.Id,
                  YearValues = (from z in yearValuesForProduct2
                                where z.ProductId == x.Id
                                select new { Year = z.Year, Value = z.Value })
                                    .ToDictionary(k => k.Year, k => k.Value)
              }).Distinct().ToList();

これは以下を返します:

Product1, Dictionary( {2000, 10} {2001, 11},{2002, 13},{2003, 14},{2004, 15}}

Product1, Dictionary( {2000, 10} {2001, 11},{2002, 13},{2003, 14},{2004, 15}}

Product1, Dictionary( {2000, 10} {2001, 11},{2002, 13},{2003, 14},{2004, 15}}

Product1, Dictionary( {2000, 10} {2001, 11},{2002, 13},{2003, 14},{2004, 15}}

Product1, Dictionary( {2000, 10} {2001, 11},{2002, 13},{2003, 14},{2004, 15}}

つまり、結合の 2 番目の部分と同じ結果が繰り返されます。

どんな助けでも感謝します:

すべてのサンプル コード

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class ProductYearValues
{
    public int ProductId { get; set; }
    public int Year { get; set; }
    public double Value { get; set; }
}

public class ProductDictionary
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public IDictionary<int, double> YearValues { get; set; }
}


static void Main(string[] args)
{
    var newProduct1 = new Product() { Id = 1, Name = "Product 1" };
    var newProduct2 = new Product() { Id = 2, Name = "Product 2" };
    var newProduct3 = new Product() { Id = 3, Name = "Product3" };

    List<Product> products = new List<Product>() { newProduct1 };

    List<ProductYearValues> yearValuesForProduct2 = new List<ProductYearValues>()
    {
        new ProductYearValues() {ProductId =newProduct2.Id, Year = 2005, Value = 20},
        new ProductYearValues() {ProductId =newProduct2.Id, Year = 2006, Value = 22},
        new ProductYearValues() {ProductId =newProduct2.Id, Year = 2007, Value = 22},
        new ProductYearValues() {ProductId =newProduct2.Id, Year = 2009, Value = 23},
        new ProductYearValues() {ProductId =newProduct2.Id, Year = 2010, Value = 24},
        new ProductYearValues() {ProductId =newProduct2.Id, Year = 2011, Value = 25}
    };


    var result = (from x in products
                  join y in yearValuesForProduct2 on x.Id equals y.ProductId
                  select new ProductDictionary
                  {
                      ProductId = x.Id,
                      Name = x.Name,
                      YearValues = (from z in yearValuesForProduct2
                                    where z.ProductId == x.Id
                                    select new { Year = z.Year, Value = z.Value })
                                    .ToDictionary(k => k.Year, k => k.Value)


                      }).Distinct().ToList();
}
4

1 に答える 1

1

ある製品のテスト コードは、比較リストに追加したり、比較リストに追加しnewProduct2たりnewProduct3しません。また、他の製品の年の値も入力しません。そこで、テスト コードを次のように少し変更しました。

List<Product> products = new List<Product>() { newProduct1, newProduct2, newProduct3 };

List<ProductYearValues> yearValuesForProduct2 = new List<ProductYearValues>()
{
    new ProductYearValues() {ProductId = newProduct1.Id, Year = 2005, Value = 99},
    new ProductYearValues() {ProductId = newProduct1.Id, Year = 2006, Value = 45},

    new ProductYearValues() {ProductId = newProduct2.Id, Year = 2005, Value = 20},
    new ProductYearValues() {ProductId = newProduct2.Id, Year = 2006, Value = 22},
    new ProductYearValues() {ProductId = newProduct2.Id, Year = 2007, Value = 22},
    new ProductYearValues() {ProductId = newProduct2.Id, Year = 2009, Value = 23},
    new ProductYearValues() {ProductId = newProduct2.Id, Year = 2010, Value = 24},
    new ProductYearValues() {ProductId = newProduct2.Id, Year = 2011, Value = 25},

    new ProductYearValues() {ProductId = newProduct3.Id, Year = 2005, Value = 100},
    new ProductYearValues() {ProductId = newProduct3.Id, Year = 2006, Value = 77},
};

次に、結果を取得するための LINQ クエリを次に示します。重要なのは、それらを同じ製品でグループ化することだと思います。

var r = products
    .Join(yearValuesForProduct2, p => p.Id, pyv => pyv.ProductId, (p, pyv) => new { Product = p, ProductYearValue = pyv })
    .GroupBy(p => p.Product, p => p.ProductYearValue)
    .Select(p => new ProductDictionary() { 
        ProductId = p.Key.Id,  
        Name = p.Key.Name,
        YearValues = p.ToDictionary(pyv => pyv.Year, pyv => pyv.Value)})
    .ToList();

この結果の製品 (LINQPad のスクリーンショット):

結果

于 2013-06-20T00:55:10.770 に答える