Linq to Entities:参数化原始 Sql 查询?
Linq to Entities: Parameterised Raw Sql query?
我正在编写一个 WCF 服务,它利用 Entity Framework 6 (EF) 查询 SQL 服务器。我的大部分查询方法都是用 LINQ 编写的。一切顺利。
我需要编写一个参数化查询。通读了这篇文章:http://adicodes.com/entity-framework-raw-sql-queries-and-stored-procedure-execution/ 这是我目前所了解的:
public string GetLinkItemValue(string linkTable, string linkItem, string linkGUID)
{
try
{
var LinkItem = new SqlParameter("@linkItem", linkItem);
var LinkTable = new SqlParameter("@linkTable", linkTable);
var LinkGUID = new SqlParameter("@LinkGUID", linkGUID);
var objectresult = _Context.Database.SqlQuery<string>("SELECT c.@linkItem FROM ISESEntities.@linkTable AS c WHERE c.CCCPGUID= @linkGUID");
return objectresult.ToString();
}
catch (Exception)
{
return string.Format("There was a problem retrieving the Link Item value for LinkTable[{0}],LinkItem[{1}],LinkGUID[{2}].", linkTable, linkItem, linkGUID);
}
}
这显然不太正确,并且在 c.@linkItem
的查询字符串上进行了整理,我已经将其 return 查询字符串作为 objectresult 字符串,但似乎无法return 查询结果。
事实上,即使我简化了查询并删除了参数:
var objectresult = _Context.Database.SqlQuery<string>("SELECT a.ArticleTitle FROM ISESEntities.vwArticles AS a where a.ArticleId = 01");
objectResult
return 是 sql 查询字符串值而不是结果。
我哪里错了?
在 SQL 字符串中,您不能参数化列名称或 table 名称。
您唯一的选择是动态构建 SQL 字符串以包含这些值
var objectresult = _Context.Database.SqlQuery<string>(
String.Format("SELECT c.{0} FROM ISESEntities.{1} AS c WHERE c.CCCPGUID= @linkGUID",linkItem,linkTable));
然后当然在其他地方删除这些参数。
关于第二期,documentation告诉我们
The query is not executed when this object is created; it is executed each time it is enumerated, for example by using foreach.
所以你必须枚举它才能看到执行查询的结果。
foreach(var item in objectresult)
// do something
也许您只想要第一个结果(根据查询本身判断),在这种情况下这也应该有效(因为它枚举了结果)
return objectresult.FirstOrDefault();
我正在编写一个 WCF 服务,它利用 Entity Framework 6 (EF) 查询 SQL 服务器。我的大部分查询方法都是用 LINQ 编写的。一切顺利。
我需要编写一个参数化查询。通读了这篇文章:http://adicodes.com/entity-framework-raw-sql-queries-and-stored-procedure-execution/ 这是我目前所了解的:
public string GetLinkItemValue(string linkTable, string linkItem, string linkGUID)
{
try
{
var LinkItem = new SqlParameter("@linkItem", linkItem);
var LinkTable = new SqlParameter("@linkTable", linkTable);
var LinkGUID = new SqlParameter("@LinkGUID", linkGUID);
var objectresult = _Context.Database.SqlQuery<string>("SELECT c.@linkItem FROM ISESEntities.@linkTable AS c WHERE c.CCCPGUID= @linkGUID");
return objectresult.ToString();
}
catch (Exception)
{
return string.Format("There was a problem retrieving the Link Item value for LinkTable[{0}],LinkItem[{1}],LinkGUID[{2}].", linkTable, linkItem, linkGUID);
}
}
这显然不太正确,并且在 c.@linkItem
的查询字符串上进行了整理,我已经将其 return 查询字符串作为 objectresult 字符串,但似乎无法return 查询结果。
事实上,即使我简化了查询并删除了参数:
var objectresult = _Context.Database.SqlQuery<string>("SELECT a.ArticleTitle FROM ISESEntities.vwArticles AS a where a.ArticleId = 01");
objectResult
return 是 sql 查询字符串值而不是结果。
我哪里错了?
在 SQL 字符串中,您不能参数化列名称或 table 名称。
您唯一的选择是动态构建 SQL 字符串以包含这些值
var objectresult = _Context.Database.SqlQuery<string>(
String.Format("SELECT c.{0} FROM ISESEntities.{1} AS c WHERE c.CCCPGUID= @linkGUID",linkItem,linkTable));
然后当然在其他地方删除这些参数。
关于第二期,documentation告诉我们
The query is not executed when this object is created; it is executed each time it is enumerated, for example by using foreach.
所以你必须枚举它才能看到执行查询的结果。
foreach(var item in objectresult)
// do something
也许您只想要第一个结果(根据查询本身判断),在这种情况下这也应该有效(因为它枚举了结果)
return objectresult.FirstOrDefault();