我正在尝试从“位置”表中获取列表,并排除已经分配给用户的位置。我正在尝试使用Linq FromSQL。如果我对user.Id参数进行硬编码,查询将起作用,而当我使用user.Id变量时,它将不起作用。查询返回所有记录。当我运行调试器时,user.Id变量是正确的。这是我的代码...
ApplicationUser user = await _userManager.FindByNameAsync(Id);
var unassignedLocations = await _context.Location
.FromSql($"SELECT * FROM Locations WHERE Id NOT IN (SELECT LocationId FROM UserLocations WHERE UserID='{user.Id}')")
.OrderBy(l => l.Name)
.ToListAsync();
Locations = new SelectList(unassignedLocations, "Id", "Name");
答案 0 :(得分:3)
问题在于值周围的引号
UserID='{user.Id}'
当对插入的SQL字符串使用FromSql
方法重载而不是将值嵌入SQL字符串内部(这将允许SQL注入攻击)时,EF Core将为字符串内部的每个占位符绑定一个参数-在此方法中情况下,单个参数的值为= user.Id
。
因此,您必须直接访问该值,而不必使用诸如常量的引号将其引起来:
WHERE UserID={user.Id}