SQLite e LINQ: encontre todos os objetos que possuem uma sublista com todos os ids presentes em uma lista fornecida de IDs

Luca

Eu tenho a seguinte aula:

public class Article
{
    long Id;
    List<Category> Categories;
}

Estou usando o EF Core 5 e o que preciso é uma consulta LINQ no SQLite que retorne todos os artigos que possuem todas as categorias que eu especificar.

Tentei o seguinte código:

List<long> cIds = c.Select (x => x.Id).ToList ();
query.Where (art => cIds.All (cId =>  art.Categories.Select (c => c.Id).Contains (cId)));

mas o compilador diz

InvalidOperationException: The LINQ expression 'DbSet<Article>()
.Where(a => __cIds_0
.All(cId => DbSet<Dictionary<string, object>>("ArticleCategory")
.Where(a0 => EF.Property<Nullable<long>>(a, "Id") != null && object.Equals(
objA: (object)EF.Property<Nullable<long>>(a, "Id"),
objB: (object)EF.Property<Nullable<long>>(a0, "ArticlesId")))
.Join(
inner: DbSet<Category>(),
outerKeySelector: a0 => EF.Property<Nullable<long>>(a0, "CategoriesId"),
innerKeySelector: c => EF.Property<Nullable<long>>(c, "Id"),
resultSelector: (a0, c) => new TransparentIdentifier<Dictionary<string, object>, Category>(
Outer = a0,
Inner = c
))
.Select(ti => ti.Inner.Id)
.Any(p => p == cId)))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

Como posso obtê-lo?

Uma possível solução que encontrei é a seguinte:

List<long> cIds = c.Select (x => x.Id).ToList ();
query = query.Where (art => art.Categories.Select (c => c.Id).Any (x => cIds.Contains (x)));
query = query.Include (x => x.Categories);

result = await query.ToListAsync ();
result = result.Where (art => cIds.All (cId => art.Categories.Select (c => c.Id).Contains (cId))).ToList ();

Mas eu queria saber se poderia obter o mesmo resultado com uma única consulta LINQ.

desde já, obrigado

ATUALIZAR:

Vou apenas adicionar a função onde este código será usado e fazer um exemplo para tornar as coisas mais claras:

Esta é a função onde o código será usado:

public                  async   Task<List<Article>>     SearchAsync                     (string search, Section s, Website w, 
                                                                                    List<Category> c)
{
    List<Article> result = new List<Article> ();

    if  (
                search == ""
            &&  s == null
            &&  w == null
            &&  c.Count == 0
        )
        return result;

    IQueryable<Article> query = dbSet.AsQueryable ();

    if (search != "")
        query = query.Where (x => x.Title.Contains (search) || x.Summary.Contains (search));

    if (s != null)
        query = query.Where (x => x.SectionId == s.Id);

    if (w != null)
        query = query.Where (x => x.WebsiteId == w.Id);

    if (c.Count > 0)
    {
        List<long> cIds = c.Select (x => x.Id).ToList ();
        query = query.Where (art => art.Categories.Select (c => c.Id).Any (x => cIds.Contains (x)));
    }

    query = query.Include (x => x.Categories);

    result = await query.ToListAsync ();

    if (c.Count > 0)
    {
        List<long> cIds = c.Select (x => x.Id).ToList ();
        result = result.Where (art => cIds.All (cId => art.Categories.Select (c => c.Id).Contains (cId))).ToList ();
    }

    return result;
}

E aqui está um exemplo:

Digamos que cirá conter ids 9,10,11e a coleção de artigos é o seguinte pseudocódigo:

List<article> articles = new List<Article> ()
{
    new Article () {Id = 1, Categories = "12,44,55"}
    new Article () {Id = 2, Categories = "7,8,9,10,11"}
    new Article () {Id = 3, Categories = "9,10,11"}
}

A consulta linq deve retornar Artigo com Id 2e 3porque ambos contêm todos os ids presentes em c.

Svyatoslav Danyliv

Uma das soluções usando Intersect, mas temos que preparar os dados para a interseção.

// articles query
var query = ...

var cIds = c.Select(x => x.Id).ToList();
var idsCount = cIds.Count();

// translating list of IDs to IQueryable
var categoryIdsQuery = dbContext.Categories
    .Where(c => cIds.Contains(c.Id))
    .Select(c => c.Id);

query = query
    .Where(art => art.Categories
        .Select(c => c.Id)
        .Intersect(categoryIdsQuery)
        .Count() == idsCount
    )
    .Include(x => x.Categories);

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Encontre todos os IDs de div, que começam e terminam com uma string específica

Encontre todos os valores em uma lista de mapas que possuem a chave "Laranjas"

Atualize todos os documentos que correspondem a uma lista de ids em um comando

Como posso recuperar todos os objetos em uma lista que possuem determinados atributos?

Encontre todos os documentos MongoDB de uma lista de ids usando o operador `in`

Encontre todos os pares com a soma fornecida, em uma matriz não classificada de números

Pegue os primeiros objetos com IDs exclusivos de uma matriz e coloque-os em uma nova lista

Encontre todos os objetos em uma lista que têm uma propriedade que corresponda a uma propriedade em outra lista de objetos

Obtenha uma lista de todos os IDs de autor de uma determinada universidade com pibliometria

Encontre todos os beans que possuem uma anotação personalizada

Encontre todos os beans que possuem uma anotação personalizada

maneira de encontrar a lista de todos os ids em uma lista de entidades de objeto interno com java 8

Como adicionar todos os IDs de documentos de uma coleção em uma lista

Tsql todos os ids e valores em uma linha

Neo4j / Cypher tentando DESENROLAR uma lista de IDs de usuário, criar uma Notificação e relacionamento com todos os usuários que foram correspondidos

Encontre todos os elementos correspondentes em uma matriz de objetos

Encontre todos os elementos correspondentes em uma matriz de objetos

Obtenha a contagem de todos os itens em uma lista que possuem uma das propriedades em outra lista

SQL - Encontre todos os "IDs de relacionamento" em que a chave é igual a valor e selecione todos os registros que contenham esses "IDs de relacionamento"

Encontrar IDs correspondentes entre dois objetos de lista diferentes apenas quando todos os IDs ou mais estiverem presentes?

Encontre todos os pares possíveis e armazene em uma lista de lista de lista

Obtenha todos os IDs de produtos Woocommerce em uma matriz

encontrar todos os IDs de planilhas em uma unidade

Comparar todos os itens de uma lista presentes em outra e na mesma ordem

É possível obter uma lista com todos os IDs de vídeo dos vídeos analisados?

Encontre todos os grupos AD recursivamente com a conta SAM fornecida em uma única consulta

Lista do Firebase Firestore de todos os IDs em uma coleção

Localizando todos os objetos que possuem uma determinada propriedade dentro de uma coleção

Encontre todos os números que estão presentes mais de 3 vezes em uma coluna de CSVs

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo