Linq to Entities:参数化Raw Sql查询?

时间:2015-01-29 13:54:28

标签: c# sql sql-server linq entity-framework

我正在编写一个WCF服务,该服务利用Entity Framework 6(EF)来查询SQL Server。我的大多数查询方法都是用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的查询字符串上有效,我已经将它作为objectresult字符串返回查询字符串,但似乎无法返回查询结果。

事实上,即使我简化了查询&amp;删除参数:

var objectresult = _Context.Database.SqlQuery<string>("SELECT a.ArticleTitle FROM ISESEntities.vwArticles AS a where a.ArticleId = 01");

objectResult返回sql查询字符串值而不是结果。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

在SQL字符串中,您无法参数化列名称或表名称。

您唯一的选择是动态构建SQL字符串以包含这些值

var objectresult = _Context.Database.SqlQuery<string>(
    String.Format("SELECT c.{0} FROM ISESEntities.{1} AS c WHERE c.CCCPGUID= @linkGUID",linkItem,linkTable));

然后当然在其他地方删除这些参数。

至于第二个问题,documentation告诉我们

  

创建此对象时不执行查询;每次枚举时都会执行它,例如使用foreach。

所以你必须枚举它以查看执行查询的结果。

foreach(var item in objectresult)
  // do something

也许你只想要第一个结果(通过查询本身判断),在这种情况下这也应该有效(因为它枚举了结果)

return objectresult.FirstOrDefault();