我编写了一个查询来显示生产线中满足特定条件的作业。基本上,它显示了我工作场所生产线特定部分的“正在进行的工作”(WIP)的工作。
我正在使用以下内容来执行我的查询:
var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@" .... ");
return CurrentWIPQuery.Count();
“JobList”是一个模型,其中包含工作编号、客户名称和某些阶段完成的日期信息。因此,该查询应该将正确的字段返回给我的模型中的这些属性。
所以这将返回查询中的行数;当前归类为正在进行的工作的工作数量。由于信息的敏感性,我没有包括实际的 SQL 查询。但我可以告诉你它工作正常。当我尝试对此查询进行参数化时会出现问题,因为我希望能够通过参数切换查询中的生产线编号,而不是键入另一行的代码。使用参数时,查询不返回任何内容。
我这样做是因为查询非常冗长,而且当我使用完整的实体框架方法时似乎效果不佳。
这是我创建参数的方式。我尝试了两种不同的方法,两种方法都失败了。方法一
var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@"
...query here...",new SqlParameter[] { ("@Cell", CellName),("@line, SCHEDULE_GROUP_NAME)});
方法二
SqlParameter WIPParam1 = new SqlParameter("@Cell", CellName);
SqlParameter WIPParam2 = new SqlParameter("@line", SCHEDULE_GROUP_NAME);
var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@"
...query here...", WIPParam1, WIPParam2);
方法 2 阻止我获得:
SqlParameter is already contained by another SqlParameterCollection
错误(我在别处有另一个使用相同参数的查询,它们在某种程度上发生冲突),但查询仍然是空的。
什么工作能正常工作时,我硬编码细胞和行号到我的SQL查询,所以我坚持,为什么当我paramaterize这些不工作。
感谢您对此的任何帮助!
您的第二种方法可能工作正常(如果没有查询和数据库结构就很难判断),但您得到的例外是因为您多次枚举结果。实体框架使用延迟执行,因此在您需要数据之前不会实际访问数据库。这意味着您的查询的返回(在本例中CurrentWIPQuery
)实际上是对去检索数据的承诺。考虑一下:
var CurrentWIPQuery = ...;
//This should work fine
var count = CurrentWIPQuery.Count();
//This will throw an exception
foreach(var thing in CurrentWIPQuery)
{
}
第二次运行CurrentWIPQuery
尝试再次运行查询,但由于SqlParameter
您传入的对象已经与另一个查询相关联,因此抛出。最简单的解决方案是通过添加到末尾来确保CurrentWIPQuery
包含物化数据而不是 an :IEnumerable
ToList()
var CurrentWIPQuery = context.Database.SqlQuery<JobList>(
@"...query here...", WIPParam1, WIPParam2)
ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句