【问题标题】:C# entity framework fromsqlraw query with includes (in) instead of where clauseC# 实体框架 fromsqlraw 查询,包含 (in) 而不是 where 子句
【发布时间】:2020-09-15 14:23:44
【问题描述】:

varname 的正确语法是什么才能使这个查询工作? 我可以让它与单个变量一起工作,例如

string varname = "TOTAL_NORWAY"

但是,如果我想在其中包含一些变量,我会返回一个空数组:

    string varname = "'TOTAL_NORWAY', 'TOTAL_SWEDEN'";
    
   return await _Context.theDataModel.FromSqlRaw(@"
                        select data
                            from data_table 
                            where Variable in ({0})
                            
    
                    ", varname).ToListAsync();

【问题讨论】:

  • 因为它被翻译成select data from data_table where Variable in ('''TOTAL_NORWAY'', ''TOTAL_SWEDEN''') ... google for "ef core" where in array
  • string varname = "'TOTAL_NORWAY', 'TOTAL_SWEDEN'"; 是一个字符串,而不是两个值。参数是 - 函数的参数,而不是字符串替换占位符。这就是他们保护免受 SQL 注入攻击的原因。这些参数中的任何内容都不会包含在查询本身中,它作为单独的参数发送到对服务器的 RPC 调用
  • 在此处查看我的博文:erikej.github.io/efcore/sqlserver/2020/04/20/…
  • 这对 ErikEJ 很有帮助,谢谢。我现在的问题是我需要包含额外的 where 子句。

标签: c# sql entity-framework


【解决方案1】:

请记住,您可以将FromSqlRaw 与 Linq 结合使用:


string varnames = new [] { "TOTAL_NORWAY", "TOTAL_SWEDEN" };

var query = _Context.theDataModel.FromSqlRaw(@"
                        select data
                            from data_table");
    
query = query.Where(x => varnames.Contains(x.Variable));
// Add more where clauses as needed
return await query.ToListAsync();

【讨论】:

    【解决方案2】:

    ErikEJ 的帖子很有帮助。对于不经常涉足 EF Core 的人来说,该解决方案并不是那么简单。

    我还需要考虑一个额外的 where 子句,这对于其他想知道的人来说都是这样做的。

    var items = new int[] { 1, 2, 3 };
    
    var parameters = new string[items.Length];
    var sqlParameters = new List<SqlParameter>();
    for (var i = 0; i < items.Length; i++)
    {
        parameters[i] = string.Format("@p{0}", i);
        sqlParameters.Add(new SqlParameter(parameters[i], items[i]));
    }
    
    sqlParameters.Add(new SqlParameter("@userid", "userXYZ123"));
    
    
    var rawCommand = string.Format("SELECT * from dbo.Shippers WHERE ShipperId IN ({0}) and userid = {1}", string.Join(", ", parameters), "@userid");
    
    var shipperList = db.Set<ShipperSummary>()
        .FromSqlRaw(rawCommand, sqlParameters.ToArray())
        .ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多