使用 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();
我编写了一个查询来显示生产线中满足特定条件的作业。基本上,它显示了我工作地点生产线特定部分的 "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();