How to Write In Clause with EF FromSql?

2020-04-21 09:19发布

问题:

I have an unknown amount of parameters for my inclause. How can I write it so it works with EF Core?

  var formattedValues = String.Join(",", values.Select(s => "'" + s + "'"));
            var identifierParam = new SqlParameter("jsonColumn", $"$.{identifierKey}");
            var filterValueParam = new SqlParameter("value", $"%{formattedValues}%");

            var items = dbContext.Items.FromSql("select * FROM Items WHERE  AND JSON_VALUE(Attributes, @jsonColumn) in (@value)", filterValueParam, identifierParam).ToList();

I think it is because each value in the in clause needs it's own Parameter.

回答1:

Since you're using SQL Server, you can pass the list of values as JSON. EG

  var jsonValues = JsonConvert.SerializeObject(values.ToList());
  var filterValueParam = new SqlParameter("@values", jsonValues );
  var identifierParam = new SqlParameter("@jsonColumn", $"$.{identifierKey}");

  var sql = "select * FROM Items WHERE  AND JSON_VALUE(Attributes, @jsonColumn) in (select value from openjson(@values))";

  var items = dbContext.Items.FromSql(sql, filterValueParam, identifierParam).ToList();