Как я могу использовать отдельное поле пользовательского запроса в EFCore? - PullRequest
2 голосов
/ 14 июля 2020
  1. В EF6 есть context.Database.sqlquery, которые я могу использовать. Почему EF Core отменяет это?
  2. Я пытаюсь найти ответ, но context.user.FromInterpolated не позволяет выбрать одно поле. (Или я использую неправильный метод?)
  3. Вот мой код. Пожалуйста, дайте мне совет, как я могу решить эту проблему.
[HttpPost]
[Obsolete]
public async Task<IActionResult> SendEmail()
{
    Email email = new Email();
    var ID = HttpContext.Request.Form["ID"].ToString();
    var Title = HttpContext.Request.Form["Title"].ToString();
    var Body = HttpContext.Request.Form["Body"].ToString();
    var Emails = context.user.FromSqlInterpolated($"select email from user where UserId in({ID})");
    foreach (var item in Emails)
    {
        if (!string.IsNullOrEmpty(item.Email))
        {
            email.Send(item.Email, Title, Body);
        }
    }
    await HttpResponseWritingExtensions.WriteAsync(this.Response, "success");
    return RedirectToAction(nameof(Index));
}

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Хорошо, прежде всего у вас есть sql инъекция в вашем коде. Итак, если пользователь передает идентификатор поля smth, например 1) или (1 = 1 . Это разрешит, и это basi c не очень вредно в вашем случае, но

Что вы должны на самом деле это

var ids= HttpContext.Request.Form["ID"].ToString().Split(",", StringSplitOptions.RemoveEmptyEntries).ToList();
if(ids.Any()){
   var Emails = await context.user.Where(u=>ids.Contains(u.UserId)).Select(u=>u.email).ToListAsync();
}
0 голосов
/ 14 июля 2020

Вы можете сделать что-то вроде этого:

public class StringReturn
{
   public string Value { get; set; }
}

partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<StringReturn>().HasNoKey();
}

using (var db = new NorthwindContext())
{
    var result = db.Set<IntReturn>()
      .FromSqlRaw("exec dbo.Scalar")
      .AsEnumerable()
      .First().Value;
    
    Console.WriteLine(result);
}

Дополнительную информацию см. В моем сообщении в блоге: https://erikej.github.io/efcore/2020/05/26/ef-core-fromsql-scalar.html

...