【问题标题】:Linq to Entities: Parameterised Raw Sql query?Linq to Entities:参数化原始 Sql 查询?
【发布时间】:2015-01-29 22:08:24
【问题描述】:

我正在编写一个 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 字符串返回,但似乎无法从查询中返回结果。

即使我简化了查询并删除了参数,事实也是如此:

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

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

我哪里错了?

【问题讨论】:

  • 您遇到了什么错误?能详细描述一下吗?
  • afaik 你不能参数化标识符(比如你的表名或列名)

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


【解决方案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();

【讨论】:

  • 另外你可以检查表名和列名是否有效:stackoverflow.com/q/10953145
  • 是的,我没有告诉查询返回 1 条记录,所以我理解必须遍历结果集。我现在收到一个异常'@p0'附近的语法不正确。
  • @Hardgraf - 我会在您的数据库上粘贴一个分析器,以查看实际访问数据库的查询。
  • 是的,从 SQL Server Profiler 跟踪中获取了 sql 语句,并在尝试在 SSMS 中执行语句时在参数上得到相同的错误。表名等是正确的,看起来它与.'s有问题。和 schema.@p1 一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多