Linq выбирает объект из реляционного списка объектов по ключевому слову поиска

Я хочу найти директора школы по ключевому слову для поиска. У школ может быть список пользователей, один из которых играет главную роль.

Теперь моя проблема в том, что я реализую автоматический поиск, который берет ключевое слово и выполняет поиск на основе названия школы, кода и основного имени.

Код:

 public class School : AuditableDataEntity<int>
    {
        [Required]
        [MaxLength(200)]
        public string Name { get; set; }

        [MaxLength(150)]
        public string Code { get; set; }

        public District District { get; set; }

        public ICollection<UserProfile> Users { get; set; }


    }

public class UserProfile : AuditableDataEntity<Guid>
    {

        [Required]
        [MaxLength(100)]
        public string FirstName { get; set; }

        [Required]
        [MaxLength(100)]
        public string LastName { get; set; }

        [Required]
        [MaxLength(200)]
        public string Email { get; set; }

        [MaxLength(50)]
        public string PhoneWork { get; set; }

        [MaxLength(20)]
        public int PhoneWorkExt { get; set; }

        [MaxLength(50)]
        public string PhoneMobile { get; set; }       

        public UserLevel UserLevel { get; set; }

        public UserRole UserRole { get; set; }

        public UserDesignation UserDesignation { get; set; }

        public School School { get; set; }
        public int? SchoolId { get; set; }

        public string FullName => $"{FirstName} {LastName}";
    }

Task<Response<IEnumerable<SchooSearchDTO>>> ISchoolQueryService.GetSchoolAutoCompleteData(string searchKeyword)
        {
            return _schoolQueryRepository.WithRelatedEntities().Where(x => x.Name.Contains(searchKeyword)
            ||x.Code.Contains(searchKeyword)
            || x.Users.FirstOrDefault(y => y.DataEntityState == DataEntityState.Published && y.UserDesignation == UserDesignation.Principal).FullName.Contains(searchKeyword)).OrderBy(u => u.Name).Select(z => new SchooSearchDTO
            {
                PrincipalName = z.Name,
                CDSCode = z.Code

            }).ToResponseListAsync();
        }

Ошибка:

Выражение LINQ 'DbSet .Where (s => s.Name.Contains (__ searchKeyword_0) || s.CDSCode.Contains (__ searchKeyword_0) || DbSet .Where (u => EF.Property> (s, "Id")! = null && EF.Property> (s, "Id") == EF.Property> (u, "SchoolId")) .Where (u => (int) u.DataEntityState == 1 && (int) u.UserDesignation == 1) .Select (u => u.FullName) .FirstOrDefault (). Contains (__ searchKeyword_0)) 'не может быть переведено. Либо перепишите запрос в форме, которая может быть переведена, либо явно переключитесь на оценку клиента, вставив вызов AsEnumerable (), AsAsyncEnumerable (), ToList () или ToListAsync (). См. https://go.microsoft.com/fwlink/?linkid=2101038. для дополнительной информации.


person Sunil Singh    schedule 30.04.2020    source источник


Ответы (1)


Проблема в том, что EF не может перевести это в SQL.

x.Users.FirstOrDefault(y => y.DataEntityState == DataEntityState.Published && y.UserDesignation == UserDesignation.Principal).FullName.Contains(searchKeyword)

Поэтому попробуйте использовать Any вместо выбора пользователя с FirstOrDefault в LINQ, чтобы EF смог преобразовать это в SQL.

Task<Response<IEnumerable<SchooSearchDTO>>> ISchoolQueryService.GetSchoolAutoCompleteData(string searchKeyword)
{
    return _schoolQueryRepository.WithRelatedEntities().Where(x => x.Name.Contains(searchKeyword)
        ||x.Code.Contains(searchKeyword)
        || x.Users.Any(y => y.DataEntityState == DataEntityState.Published && y.UserDesignation == UserDesignation.Principal && y.FirstName.Contains(searchKeyword))
    ).OrderBy(u => u.Name).Select(z => new SchooSearchDTO
    {
        PrincipalName = z.Name,
        CDSCode = z.Code

    }).ToResponseListAsync();
}

См. Выражение LINQ не могло быть переведены и будут оцениваться на месте

Редактировать:

Вам также необходимо использовать FirstName, поскольку FullName - это свойство, которого нет в SQL.

person Selim Yildiz    schedule 30.04.2020
comment
Та же ошибка с любой необходимостью искать другой выход. - person Sunil Singh; 30.04.2020
comment
Это сработало путем изменения && y.FirstName.Contains (searchKeyword). Проблема была с FullName, поэтому она работала путем изменения на Any и изменения FullName на FirstName. - person Sunil Singh; 30.04.2020
comment
Да, хороший момент, я забыл упомянуть об этом .. Я обновил свой ответ. - person Selim Yildiz; 30.04.2020