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

因此,例如,我会编写一个如下所示的查询来查询联系人:
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倍的时间。
对于我如何能够克服这种恶劣的需求组合,有什么想法吗?
发布于 2013-09-10 08:54:16
从那时起,我就找到了这个链接:在LINQ查询中不使用Skip()会导致效率低下的行为
在LINQ查询中使用LoadWith()和and ()似乎存在缺陷。我的测试和分析使用了不带Skip()的used ()语句。幸运的是,在我们的实现中,我们正在分页,因此我们已经使用了Skip()并将()合并在一起,所以我们不受这个bug的影响。
查看在SqlProfiler中执行的SQL --只执行一条语句,返回一个大记录集并合并数据(正如我在问题中所描述的)。然而,Linq似乎能够更好地处理这个问题,并且最终提供了比我的手动解析更易读的代码。
希望这能有所帮助。
https://stackoverflow.com/questions/18697754
复制相似问题