首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ-2-SQL检索和搜索关系数据

使用LINQ-2-SQL检索和搜索关系数据
EN

Stack Overflow用户
提问于 2013-09-09 12:00:08
回答 1查看 311关注 0票数 1

我有一个场景,我需要能够动态地查询一个实体,使用它的相关数据并从DB、实体返回它的相关数据。

因此,例如,我会编写一个如下所示的查询来查询联系人:

代码语言:javascript
复制
context.Contacts.Where(c.Forename == "Alex" &&
c.MetaData.Any(meta => meta.ItemName == "Email" && meta.ItemValue == "alex@myemail.com"))

但是,我不仅要返回联系人表条目,还要返回联系人的地址和联系人的所有元数据。

我研究了Include()语句和DataLoadOptions.LoadWith()选项,但是这两种选项都是低效的,因为它们是基于每个实体进行查询的。因此,如果我的查询匹配200个实体,就会有200个地址查询和200个MetaData查询。所以这不会有任何用处。

或者,我可以在Linq查询上构造一个.Select()语句,该语句将联系人、地址和MetaData记录组合在一起。但是,对于具有两个地址和10个元数据项的单个实体,这将导致以平面格式返回20条记录。这对单个实体来说是可怕的--但是想象一下,在200个匹配的实体中,有4000条记录要解析为20个实体.尤克。

所以我有点卡住了。如果我完全在DB层中,我将构建一个查询,该查询将Id转储到一个临时表中,然后连接到每个表并将它们一起返回,然后在域逻辑中获取IMultipleResults并从中构造实体。

但是,我的问题是,我必须将用户驱动的查询转换为linq语法(使用表达式)并以这种方式进行查询。to绝对不够动态,不能让我做任何我需要做的事情。

我可以查询每组数据,但这意味着对数据库的三次点击,而我只需要缩小一次结果集,并为此提取相关数据。如果获得Contact.ContactIds的初始查询需要一段时间,那么我不希望增加用户体验,使其花费3倍的时间。

对于我如何能够克服这种恶劣的需求组合,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-10 08:54:16

从那时起,我就找到了这个链接:在LINQ查询中不使用Skip()会导致效率低下的行为

在LINQ查询中使用LoadWith()和and ()似乎存在缺陷。我的测试和分析使用了不带Skip()的used ()语句。幸运的是,在我们的实现中,我们正在分页,因此我们已经使用了Skip()并将()合并在一起,所以我们不受这个bug的影响。

查看在SqlProfiler中执行的SQL --只执行一条语句,返回一个大记录集并合并数据(正如我在问题中所描述的)。然而,Linq似乎能够更好地处理这个问题,并且最终提供了比我的手动解析更易读的代码。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18697754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档