簡體   English   中英

C#Linq加入問題

[英]C# Linq Join Issue

我試圖加入兩個對象列表,並更新第一個對象(ProductReport)中的property(Revenue),使其與加入的對象(Transaction)中的property(Revenue)相同。 該代碼是打擊:

using System.Collections.Generic;
using System.Linq;

namespace TestConsole
{
    public class ProductReport
    {
        public string productName { get; set; }
        public int PrdouctID { get; set; }
        public double Revenue { get; set; }
    }

    public class Transaction
    {
        public double Revenue { get; set; }
        public int PrdouctID { get; set; }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            List<ProductReport> products = new List<ProductReport>();
            ProductReport p = new ProductReport();
            p.productName = "Sport Shoe";
            p.PrdouctID = 1;

            products.Add(p);

            List<Transaction> transactions = new List<Transaction>();
            Transaction t1 = new Transaction();
            t1.PrdouctID = 1;
            t1.Revenue = 100.0;

            Transaction t2 = new Transaction();
            t2.PrdouctID = 1;
            t2.Revenue = 200.00;

            transactions.Add(t1);
            transactions.Add(t2);

            var results = (from product in products
                           join transaction in transactions on product.PrdouctID equals transaction.PrdouctID into temp
                           from tran in temp.DefaultIfEmpty()
                           select new { product, tran }
                           ).ToList();

            results.ForEach(x => x.product.Revenue = x.tran.Revenue);
        }

    }
}

該代碼根據ProductID連接2個對象列表。 我希望在結果對象中看到兩個ProductReport項,分別具有100.00和200.00的收入。 但是,foreach函數以某種方式覆蓋了第一個ProductReport中的Revenue屬性。 最后,兩個ProductReport的收入均為200.00。 誰能幫助我,以及如何輕松獲得我想要的結果? 謝謝。

您只需要更改您的加入

var results = (from p in products
join t in transactions on p.ProductID equals t.ProductId
select new ProductReport{
  ProductName = p.productName,
  ProductId = p.ProductID,
  Revenue = t.Revenue
}).ToList();

然后,您將獲得一個列表,其中包含2個條目,分別用於ProductId = 1(運動鞋)

ProductName = "Sport Shoe"
ProductId = 1
Revenue = 200.00

ProductName = "Sport Shoe"
ProductId = 1
Revenue = 100.00

foreach函數以某種方式覆蓋了第一個ProductReport中的Revenue屬性。 最后,兩個ProductReport的收入均為200.00。

在下面的行中, x.product引用相同的實例。

results.ForEach(x => x.product.Revenue = x.tran.Revenue);

您只有一個ProductReport對象,並且其Revenue屬性只能有一個值。 該單個實例的Revenue屬性不能同時為100.00和200.00。 第一次寫入時,將其設置為100.00 ,第二次寫入時,將其覆蓋為200.00

我期望在結果對象中看到兩個ProductReport項目。

您的代碼僅創建一個ProductReport項目。 如果要查看其中兩個(或多個),則需要創建兩個(或多個)對象。 以下代碼利用Select為您完成此操作。 ForEach更改原始對象,而Select和LINQ的其余部分會創建一個新對象,而不會更改原始對象。

var results =
    from product in products
    join transaction in transactions on product.PrdouctID equals transaction.PrdouctID
    select new 
    {
        product, transaction
    };

var updated = results.Select(x => {
    x.product.Revenue = x.transaction.Revenue;
    return x.product;
});

這是此輸出的小提琴

Sport Shoe 100
Sport Shoe 200

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM