投影中的可重用子查询

时间:2018-11-14 20:53:55

标签: c# entity-framework linq entity-framework-core

我正在尝试在执行查询的地方重构一些代码,然后在投影内部有两个子查询。看起来像:

from product in context.Product join ... join ... where ... select new ProductReturn() { ...., FileCount = (from ...), SomeOtherCount = (from ...) }

子查询以前是在LINQ查询之后完成的,它是循环执行的(每个产品进行两个新的SQL查询),但是我将它们折叠到了select中,效果很好。

但是现在我想提取如何将FileCount和SomeOtherCount提取到它们自己的方法中,这样就不必在所有地方重复这些子查询。

我基本上复制了LINQ查询,创建了一个新方法,键入return,然后粘贴查询。我需要添加一些缺少的参数,例如产品和上下文以及分号。

然后我的新投影看起来像: select new ProductReturn() { ...., FileCount = GetFileCount(context, product), SomeOtherCount = GetSomeOtherCount(context, product) });

这可以编译!但是在运行时,我得到一个例外: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

我想它正在尝试在仍然实现第一个查询的同时执行我的子查询,这意味着即使工作成功,它也会执行多个SQL查询而不是一个SQL查询。

是否有可能实现我想做的事情,还是需要将子查询复制粘贴到任何地方?

我尝试将签名从 从private Expression<Func<Product, int>> GetFileCount(MyDbContext context, Product product)private Expression<Func<Product, int>> GetFileCount(MyDbContext context, Product product),就像我在寻找答案时在某些地方看到的,但是GetFileCount甚至没有编译:

Cannot implicitly convert type 'System.Linq.Expressions.Expression<System.Func<Product, int>>' to 'int'

0 个答案:

没有答案