Запрос для записей, которые должны содержать набор значений в Entity Framework Core - PullRequest
0 голосов
/ 10 февраля 2020

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

Вот сущности с соответствующими свойствами, что является просто много ко многим отношения смоделированы в EF Core.

public class Record
{
     public int Id { get; set; }
     public ICollection<RecordTag> RecordTags { get; set; }
}

public class RecordTag
{
    public int RecordId { get; set; }
    public Song Record { get; set; }

    public int TagId { get; set; }
    public Tag Tag { get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<RecordTag> RecordTags { get; set; }
}

Я попытался написать запрос EF Core следующим образом:

var tagList = tags.Split(',');
// tagList now contains the strings of tags the user has filtered on

Records = recordRepository.Query() // simply returns IQueryable<Records> 
          .Where(r=> tagList.All(  // For each record, iterate through all tags selected by the user
                t => r.RecordTags.Select(rt => rt.Tag.Name).Contains(t))) // For each user selected tag, get all the tags on the record and ensure it contains the tag we're iterating over
                .Include(r => r.RecordTags).ThenInclude(rt => rt.Tag).ToList(); // Include the tag data back with the parent entity.

Однако, это выдает ошибку

[запрос] не может быть переведен. Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ()

Я бы предпочел не возвращать больший набор и фильтровать его на сервере приложений, скорее, если бы запрос был правильно скомпонован непосредственно с БД.

Почему этот запрос недействителен? Есть ли другой способ написать это так?

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете добавить, где условия в foreach l oop.

var recordRepositoryQuery = recordRepository.Query();
foreach(var tag in taglist)
{       
   recordRepositoryQuery = recordRepositoryQuery.Where(r => r.RecordTags.Select(rt => rt.Tag.Name).Contains(tag))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...