Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用join更新Linq_C#_Linq - Fatal编程技术网

C# 使用join更新Linq

C# 使用join更新Linq,c#,linq,C#,Linq,我有这两个系列 var materials = new List<Models.Material>(); materials.Add(new Models.Material { Number = 111, Value = null }); materials.Add(new Models.Material { Number = 222, Value = null }); var db_materials = new List<Models.DB_Material>();

我有这两个系列

var materials = new List<Models.Material>();
materials.Add(new Models.Material { Number = 111, Value = null });
materials.Add(new Models.Material { Number = 222, Value = null });

var db_materials = new List<Models.DB_Material>();
db_materials.Add(new Models.DB_Material { Number = 111, ValueColumn = 10});
db_materials.Add(new Models.DB_Material { Number = 222, ValueColumn = 20 });
db_materials.Add(new Models.DB_Material { Number = 333, ValueColumn = 30 });
db_materials.Add(new Models.DB_Material { Number = 444, ValueColumn = 40 });
var materials=新列表();
materials.Add(新模型.Material{Number=111,Value=null});
materials.Add(新模型.Material{Number=222,Value=null});
var db_materials=新列表();
db_materials.Add(new Models.db_Material{Number=111,ValueColumn=10});
db_materials.Add(new Models.db_Material{Number=222,ValueColumn=20});
db_materials.Add(new Models.db_Material{Number=333,ValueColumn=30});
db_materials.Add(new Models.db_Material{Number=444,ValueColumn=40});
我需要使用db_materials集合中的ValueColumn更新materials集合中的所有Value属性


如何做到这一点?

您也可以在没有连接的情况下做到这一点。 请尝试以下代码段:

materials.ForEach(x => x.Value = db_materials.FirstOrDefault(y => y.Number == x.Number).ValueColumn);

ForEach()将更新原始实例本身中的值。无需使用循环或联接。

这里没有联接:

  materials =  materials.Select(c => { c.Value = db_materials.Where(dbm => dbm.Number == c.Number).ToList().FirstOrDefault().Value; return c; }).ToList();

我测试了以下代码,它可以正常工作

            var joins = from material in materials
                        join db_material in db_materials on material.Number equals db_material.Number
                        select new { material = material, db = db_material};

            foreach (var join in joins)
            {
                join.material.Value  = join.db.ValueColumn;
            }

您还可以使用AND query更新主集合,为此,您需要使用第一列连接where子句,然后使用第二列连接where子句进行更新。您可以在这里查看示例,

这非常优雅,谢谢:)它更新了数字属性而不是值属性<代码>materials.ForEach(x=>x.Value=db_materials.FirstOrDefault(y=>y.Number==x.Number).ValueColumn)对我有用。是的,这是打字错误,更新了答案。虽然这段代码可以回答这个问题,但提供了关于为什么和/或这段代码如何回答这个问题的附加上下文,提高了它的长期价值。我认为联接集合包含对原始两个集合的引用。然后,Foreach更新特定值。我意识到的问题是,当一个集合是
IList
而另一个集合是
DbSet
时,join抛出的错误是
join子句中一个表达式的类型不正确。调用“Join”时类型推断失败
我不知道如何解决这个问题,但可能是另一个SO问题的具体问题。我试图解释在这个线程中更具体的是数字、字符串还是整数?Material类将其显示为字符串,但我无法告诉db它是否也是字符串。这违反了LINQ的函数特性。LINQ方法不应该修改流经管道的对象。