【问题标题】:How can I populate a single attribute in linq?如何在 linq 中填充单个属性?
【发布时间】:2018-04-12 19:58:17
【问题描述】:

我有一个 LINQ 查询,它从 2 个表中检索值:

    Dim query =  From t1 In context.table1
                 Join t2 In context.table2
                 On t1.ID Equals t2.ID
                 Select t1, t2

table1 有一个table2 类型的未映射属性,我想使用选定的t2 值填充它。

我尝试过使用以下方法:

For Each val In query.AsEnumerable() 
    val.t1.t2property = val.t2
Next

当我运行代码时,t2property 没有被填充(可能是由于延迟加载导致查询未加载(请在此处更正我)。

增加的复杂性是我必须将此查询用作另一个数据库查询中的源列。

有没有办法在初始查询中从select 填充未映射的t2property

或者我可以做些什么来分配val.t1.t2property = val.t2

【问题讨论】:

  • 如果使用数据库,是否需要context.SubmitChanges()更新数据库?如果您使用的是 EF,您的 t2property 应该已经包含正确的 t2 并为您处理连接。
  • @NetMage 我使用的表格仅供参考。目的是允许应用程序进行一些计算,然后将计算的信息放入数据库中的不同表中。我正在使用 EF,但 t2property 没有映射到数据库(它是在事后添加到表模型中的),所以它不是由查询填充的。因此,t2 属性最终为空,并且 t2 填充了所需的值。
  • 你怎么知道t2property 没有被填充?在for each 循环之后,您如何访问t2property
  • 因为在循环之后我在另一个查询(query2)中使用了查询,当我查看来自 query2 的结果时,t2property 为空。

标签: vb.net linq linq-to-entities


【解决方案1】:

当您为变量分配 LINQ 查询时,该变量不会被分配查询的结果,而是可以稍后执行的查询表示。当您执行某些导致执行查询的操作时,查询返回的对象将从数据库中实例化并在内存中创建。

当您在 query 上执行 For Each 循环时(AsEnumerable() 在这里没有用处),将执行查询,创建 table1table2 的对象,并创建匿名对象那些包含t1t2的。

退出For Each循环后,所有这些对象都会被丢弃,下次执行query时,会从数据库中提取新数据并创建新对象。

如果您需要保持并修改或查询内存中的对象,则需要将query 的类型更改为可以保存对象的类型。通常是ArrayList,一般来说ToList 是更好的选择。

Dim query = (From t1 In table1
             Join t2 In table2 On t1.ID Equals t2.ID
             Select t1, t2).ToList()

For Each val In query
    val.t1.t2property = val.t2
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多