使用 SqlParamter 时查询 Returns 无:Entity Framework

Query Returns Nothing when using SqlParamter: Entity Framework

我编写了一个查询来显示生产线中满足特定条件的作业。基本上,它显示了我工作地点生产线特定部分的 "works in progress" (WIP) 工作。

我正在使用以下命令执行我的查询:

var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@" ....  ");
return CurrentWIPQuery.Count();

"JobList" 是一个模型,它包含工作编号、客户名称和某些阶段完成时间的一些日期信息。所以查询应该 return 我模型中这些属性的正确字段。

所以这 returns 来自查询的行的 COUNT;当前归类为正在进行的工作的工作数量。由于信息的敏感性,我没有包含实际的 SQL 查询。 但是 我可以告诉你它工作正常。 问题在我尝试参数化此查询时出现,因为我希望能够通过参数切换查询中的生产线编号,而不是键入另一行的代码。使用参数时,查询 return 什么都没有。

我这样做是因为查询很长,而且当我使用完整的 entity framework 方法时似乎效果不佳。

以下是我创建参数的方式。我尝试了两种不同的方法,但两种方法都失败了。 方法一

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 查询中时它工作正常,所以我不知道为什么它不起作用当我将这些参数化时。

感谢您对此的任何帮助!

你的第二种方法可能工作正常(如果没有查询和数据库结构很难判断)但你得到的异常是因为你多次枚举结果。 Entity Framework 使用延迟执行,因此在您需要数据之前不会实际访问数据库。这意味着您的查询中的 return(在本例中为 CurrentWIPQuery)实际上是对检索数据的承诺。考虑一下:

var CurrentWIPQuery = ...;

//This should work fine
var count = CurrentWIPQuery.Count(); 

//This will throw an exception
foreach(var thing in CurrentWIPQuery)
{
}

第二个 运行 到 CurrentWIPQuery 尝试再次 运行 查询,但是因为您传入的 SqlParameter 对象已经与另一个查询关联,它抛出。最简单的解决方案是通过在末尾添加 ToList() 来确保 CurrentWIPQuery 包含物化数据而不是 IEnumerable

var CurrentWIPQuery = context.Database.SqlQuery<JobList>(
    @"...query here...", WIPParam1, WIPParam2)
    ToList();