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

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

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

Код:

 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). Выберите (u => u.FullName ) .FirstOrDefault (). Contains (__ searchKeyword_0)) 'не может быть переведен. Либо переписайте запрос в форме, которую можно перевести, либо переключитесь на оценку клиента явно, вставив вызов либо в AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

1 Ответ

1 голос
/ 30 апреля 2020

Проблема здесь в том, что 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.

...