使用SqlParamter:Entity Framework时,Query不返回任何内容

时间:2017-03-13 15:55:07

标签: c# sql .net entity-framework sqlparameters

我编写了一个查询来显示符合生产线特定条件的作业。基本上,它显示了正在进行中的工作" (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查询中时它工作正常,所以我不知道为什么它不起作用我把它们分开了。

感谢您提供任何帮助!

1 个答案:

答案 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();