我编写了一个查询来显示符合生产线特定条件的作业。基本上,它显示了正在进行中的工作" (WIP)用于我工作场所生产线的特定部分。
我使用以下命令执行查询:
var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@" .... ");
return CurrentWIPQuery.Count();
&#34;作业表&#34;是一个模型,其中包含作业编号,客户名称以及某些阶段完成时的某些日期信息。因此,查询应该在我的模型中将适当的字段返回给这些属性。
所以这会从查询中返回行的COUNT个;目前被归类为正在进行的工作的工作数量。由于信息的敏感性,我没有包含实际的SQL查询。 但是我可以告诉你它工作正常。 当我尝试对此查询进行参数化时会出现问题,因为我希望能够通过参数切换查询中的生产线号,而不是键入另一行的代码。使用参数时,查询不返回任何内容。
我这样做是因为查询非常冗长,而且当我使用完整的实体框架方法时,它似乎无法正常工作。
以下是我创建参数的方法。我尝试了两种不同的方法,但两种方式都失败了。 方法1
var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@"
...query here...",new SqlParameter[] { ("@Cell", CellName),("@line, SCHEDULE_GROUP_NAME)});
方法2
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
错误(我在其他地方有另一个使用相同参数的查询,但它们之间存在冲突),但查询仍为空。
什么工作当我将Cell和行号硬编码到我的sql查询中时它工作正常,所以我不知道为什么它不起作用我把它们分开了。
感谢您提供任何帮助!
答案 0 :(得分:1)
您的第二种方法可能正常工作(没有查询和数据库结构很难判断),但您获得的异常是因为您多次枚举结果。实体框架使用延迟执行,因此在您需要数据之前实际上不会访问数据库。这意味着从查询返回(在本例中为CurrentWIPQuery
)实际上是一个去检索数据的承诺。考虑一下:
var CurrentWIPQuery = ...;
//This should work fine
var count = CurrentWIPQuery.Count();
//This will throw an exception
foreach(var thing in CurrentWIPQuery)
{
}
第二次运行CurrentWIPQuery
尝试再次运行查询,但由于您传入的SqlParameter
个对象已经与另一个查询相关联,因此它会抛出。最简单的解决方案是通过在结尾添加CurrentWIPQuery
来确保IEnumerable
包含具体化数据而不是ToList()
:
var CurrentWIPQuery = context.Database.SqlQuery<JobList>(
@"...query here...", WIPParam1, WIPParam2)
ToList();