使用另一个查询的相同字段从 LINQ 构造对象

Posted

技术标签:

【中文标题】使用另一个查询的相同字段从 LINQ 构造对象【英文标题】:Construct object from LINQ using same fields of another query 【发布时间】:2009-07-07 14:27:14 【问题描述】:

例子

SQL

create view v_join 
as select m.* , d.oneDetail from master m, detail d 
where m.key = d.key

LINQ

var view = from v in dc.v_join select new

   Master = ???? /// that is an issue, how can I construct the objects using same fields but from another query,
   Detail = v.oneDetail

;

foreach (var entry in view)

  Master mEntry =  entry.Master; // then we can use it, there are no problems

这种情况经常遇到,是否有一些棘手的方法可以使用相同的字段但从另一个视图构造对象并使用。

当我在 C# 端进行此类连接时,我会遇到性能低下、延迟加载等问题。无论如何,LINQ 会发出许多查询来获取每个详细记录,从性能的角度来看这是不可接受的。

必须有明显的解决方案,我不敢相信没有人面临同样的问题。 像 dc.Translate 这样的所有显而易见的解决方案几乎都是一样的,但并不完全符合我的需要。

帮助表示赞赏。

【问题讨论】:

【参考方案1】:

来自 dc.Master 中的 m 在 m.Key = d.Key 上加入 dc.Detail 中的 d 选择新的 m, d ;

【讨论】:

我试过这样的方法,判断结果的进一步处理非常慢,我想LINQ会发出单独的查询来获取每个详细记录 它没有。上面的查询将产生一次命中。如果您遇到性能问题,请提供更多详细信息(例如 db 架构、表详细信息等)。【参考方案2】:

这是否满足您的需求?

Master = new Master()  Field1 = v.Field1, Field2 = v.Field2, Field3 = v.Field3 

【讨论】:

是的,没错,但我想避免手动构建每个字段 我不确定我是否理解。您想要一个高性能的解决方案,但您不想使用这种方法。你有没有测试过它是否足够快?如果是这样,那为什么不使用这个构造函数呢?【参考方案3】:

对我来说,这听起来很奇怪。您使用视图的原因是在模型上有不同的“视图”,而不是访问原始模型。

如果你真的需要,我建议你继续加入 LINQ 中的主从表,你可以使用 loadWith Options 摆脱延迟加载。正确调整后,LINQ 可以进行预先加载,从而解决性能问题。

【讨论】:

【参考方案4】:

尝试使用 DataLoadOptions 和 LoadWith,请参阅:http://dotnet.org.za/hiltong/archive/2008/02/12/lazy-loading-in-linq-loadwith-and-associatewith-dataloadoptions-part-1-loadwith.aspx

例如

System.Data.Linq.DataLoadOptions dl = new System.Data.Linq.DataLoadOptions();
dl.LoadWith<Detail>( detail => detail.Master )

【讨论】:

当我尝试共享 dataContext 或使用外部数据时会导致问题。将抛出异常。【参考方案5】:

你不能吗 从 dc.v_join 中的 v 选择新的 主 = 新 Column1Name = v.masterColumn1, Column2Name = v.masterColumn2, ... , 细节 = v.oneDetail ; ?

【讨论】:

明显的方法,但我想避免显式构造。

以上是关于使用另一个查询的相同字段从 LINQ 构造对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用可重复对象中的嵌套必填字段将数据从一个表复制到另一个表

多个表相同的字段LINQ

如何将结构转换为具有完全相同字段名称和类型的另一个结构?

(转)LINQ查询操作符之DistinctUnionConcatIntersectExcept

Hibernate:如何让两个集合字段指向相同的对象

如何使用 linq 查询具有嵌套列表的对象?