如何使用从查询中提取的另一个对象的值为linq查询中的所有项设置属性?

本文关键字:查询 linq 设置 属性 一个对象 何使用 提取 | 更新日期: 2023-09-27 18:11:52

我有一个查询从数据库拉:

List<myClass> items = new List<myClass>(from i in context
                      select new myClass
                      {
                          A = i.A,
                          B = "",    // i doesn't know this, this comes from elsewhere
                          C = i.C
                      }

我也有另一个查询做类似的事情:

List<myClass2> otherItems = new List<myClass2>(from j in context
                            select new myClass2
                            {
                                A = j.A,   // A is the intersection, there will only be 1 A here but many A's in items
                                B = j.B
                            }

实际上,这些类要大得多,而且查询的数据不仅由数据库分隔,而且由服务器分隔。是否有可能使用LINQ查询来填充所有items的属性B,其中项目。一个相交吗?所有内置的LINQ谓词似乎只用于聚合、选择或bool表达式。

在我的脑海里,我有这样的东西,但这是全部关闭:

items.Where(x => x.B = (otherItems.Where(z => z.A == x.A).Single().B));

或者我是荒谬的,试图使这个工作在LINQ,应该放弃它,赞成一个for循环,实际设置变得微不足道?由于截止日期,我将诉诸于for循环(无论如何,从长远来看,它最终可能会更具可读性),但这可能吗?是否需要一个扩展方法来添加一个特殊的谓词来允许这一点?

如何使用从查询中提取的另一个对象的值为linq查询中的所有项设置属性?

LINQ是为查询而设计的。如果您试图设置内容,则绝对应该使用循环(可能是foreach)。这并不意味着你不能使用LINQ 作为循环的一部分,但你不应该试图在LINQ本身中应用副作用。

先查询OtherItems。对结果执行ToDictionary()。然后,在查询数据库时,执行以下操作:

var items = from i in context
   select new myClass 
   { A = i.A, 
     B = otherItems[i.A], 
     C = i.C
   }