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

C# 如何使用也从查询中提取的另一个对象的值为linq查询中的所有项设置属性?,c#,linq,properties,extension-methods,C#,Linq,Properties,Extension Methods,我有一个从数据库中提取的查询: List<myClass> items = new List<myClass>(from i in context select new myClass { A = i.A, B = "", // i doesn't know this, thi

我有一个从数据库中提取的查询:

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
                      }

或者我试图在LINQ中实现这一点是荒谬的,应该放弃它,转而使用实际设置变得微不足道的for循环吗?由于截止日期的关系,我将求助于for循环(从长远来看,它可能会更具可读性),但有可能做到这一点吗?是否需要一个扩展方法来添加一个特殊的谓词以允许此操作?

LINQ是为查询而设计的。如果您试图设置东西,那么一定要使用循环(可能是
foreach
)。这并不意味着您不能将LINQ用作循环的一部分,但您不应该试图在LINQ本身中应用副作用。

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

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

我想说你的for循环是一个很好的实现。你能展示一个简单的数据集,它具有你正在寻找的主要结构吗?最后一个查询试图实现什么?@Tormod:第二个查询包含
B
变量。我正在寻找一个谓词或扩展方法,它将在第一个集合中执行
B
变量的填充。一个矛盾可能是插入、更新和删除的用法。这表明它可能不仅仅是为了查询而设计的。我同意框架中打包的默认谓词只针对查询,但这让我想知道,如果应用程序可以扩展到简单查询之外,是否需要彻底扩展方法。我完全明白“可以”和“应该”之间的区别。在这一点上,我正在探索这种可能性(并试图填补我自己对LINQ知识的空白)。@JoelEtherton:它们是特定LINQ提供商补充的一部分,而不是LINQ本身的一部分。每个LINQ提供程序都是“遵循LINQ模式的查询部分”加上其他特定于提供程序的部分。我认为类似的内容适合LINQ to对象,但我可以理解为什么它不是默认实现。因此,在您看来,如果我需要这样的东西来证明工作成本的合理性,那么有必要(谨慎地?)实现我自己的自定义LINQ to MyNamespace provider?@JoelEtherton:它不适合LINQ to对象,因为LINQ是功能性的,没有副作用。这违背了林克的整个哲学。无论如何,为可能与LINQ一起工作的副作用编写可重用的方法,但我不会试图让它们看起来像LINQ的一部分。LINQ不允许数据查询和内存查询的组合。它将编译,但会生成运行时异常,因为本地序列不能在数据上下文中使用。要使数据查询部分工作,它必须执行该部分并将其带到本地序列,然后执行另一个选择,这将创建一个冗余查询(我将使用LINQ来避免)。对。本地闭包不会通过表达式树转换为LINQ查询提供程序。那么,这取决于您希望查询如何执行。如果希望对查询进行延迟计算,则在迭代时可能会多次命中查询。但是我想您可以通过执行src.Select(remdata=>new{}).AsEnumerable().Select(localdata=>new{A=ld.A,B=otherItems[ld.A],C=ld.C})来实现
items.Where(x => x.B = (otherItems.Where(z => z.A == x.A).Single().B));
var items = from i in context
   select new myClass 
   { A = i.A, 
     B = otherItems[i.A], 
     C = i.C
   }