asp. net ядро ​​пытается выбрать объекты, которые содержат точный идентификатор - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь извлечь объекты базы данных, где текущий идентификатор пользователя находится в списке этих объектов.

Моя модель:

 public class Procedure
 {
   ...
   public IList<User> Lawyers{ get; set; }
   ...
 }

И в контроллере:

    [HttpGet]
    public async Task<IActionResult> MyProcedures()
    {
        var user = await userManager.GetUserAsync(User);
        var procedures = context.Procedures.Where(x => x.Lawyers.Contains(user));
        return View(procedures);
    }

При этом выбирается только один объект.

РЕДАКТИРОВАТЬ: проблема в моем классе User, он берет только один идентификатор из процедуры и поэтому показывает мой единственный (последний добавленный). Спасибо за помощь, ребята!

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Вам чего-то не хватает, какой пользователь ??

Либо передайте что-нибудь в сигнатуру вашей функции , либо получите от HTTPContex t вам нужно найти пользователя, которого вы хотите найти

Если вы используете ASP ядро немного отличается от старых способов

Сначала это:


var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;

А теперь ..

// make sure you can access/inject it if you want
// private.. _httpContextAccessor 
// then in your action

[HttpGet]
public async Task<IActionResult> MyProcedures()
{
    // again make sure you can access the context _httpContextAccessor
    var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
    var procedures = context.Procedures.Where(x => x.Lawyers.Contains(userId).FirstOrDefault());

    //... fill in whatever logic you want.. 

    return View(parnice);
}

Обновление 2 на основе вопроса / комментариев:

Сделайте это в два шага

  1. Шаг 1: Получить текущего пользователя (с помощью claims или HTTPContext, как показано ниже), например, System.Security.Claims.ClaimsPrincipal currentUser = this.User;
  2. Шаг 2. С помощью пользователя найдите все связанные Lawyers et c. context.Procedures.Where(x => x.Lawyers.Contains(userId)

Обязательно зарегистрируйте HttpContextAccessor при запуске ... дважды отметьте это .., чтобы зарегистрироваться в файле Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

В оригинале Базовая версия, я должен дважды проверить, изменилась ли она сейчас, при условии, что ваш код находится внутри MVC контроллера:

public class YourController : Microsoft.AspNetCore.Mvc.Controller

Теперь, так как у вас есть базовый класс Controller, вы можете получить IClaimsPrincipal из User свойства

System.Security.Claims.ClaimsPrincipal currentUser = this.User;

Вы можете проверить претензии напрямую (без обратной поездки в базу данных):

var userId = _userManager.GetUserId(User); // Get user id:

К вашему Во втором комментарии вы можете получить либо UserId, либо UserName

     //  user's userId    
     var userId =  User.FindFirstValue(ClaimTypes.NameIdentifier) 
     //  user's userName
     var userName =  User.FindFirstValue(ClaimTypes.Name) 

Хорошая ссылка , надеясь, что это поможет:)

0 голосов
/ 27 апреля 2020

То, как вы написали, будет работать, если у вас есть icomparable или что-то реализованное, что может сказать, что юрист является «пользователем», если идентификатор пользователя совпадает.

Без этого вам бы пришлось обойтись с Lawyers.Any (x => x.UserId == user.UserId)

...