Я пытаюсь создать систему фильтрации на сайте для набора записей, которые могут быть помечены несколькими тегами. В конце концов я бы хотел, чтобы фильтр поддерживал ИЛИ, И, И НЕ, но сейчас я просто пытаюсь заставить И работать.
Вот сущности с соответствующими свойствами, что является просто много ко многим отношения смоделированы в 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 ()
Я бы предпочел не возвращать больший набор и фильтровать его на сервере приложений, скорее, если бы запрос был правильно скомпонован непосредственно с БД.
Почему этот запрос недействителен? Есть ли другой способ написать это так?