我正在尝试在执行查询的地方重构一些代码,然后在投影内部有两个子查询。看起来像:
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'