Pergunta

Eu estou tentando executar o que só posso descrever como a versão inversa da IN () utilizando os Critérios NHibernate ..

Ao invés de dizer o valor armazenado na propriedade está na lista / coleta X

Eu quero dizer, esse valor X (um ID) está na lista que é uma propriedade do objeto.

Qualquer ajuda apreciado, eu posso tentar explicar melhor se isso não faz sentido.

Editar Desculpas para as pessoas, como eu entendo isso não faz o suficiente sentido ...

Eu tenho um item de evento no meu sistema que pode ter uma lista de público (itens) que se aplica. Se o administrador quer excluir um item Audiência Quero verificar que o item não é referenciado por quaisquer eventos. (O AudienceList é armazenado como uma lista de strings de IDs para Públicos).

O que eu estava pensando era algo ao longo das linhas de:

Var resultados = SessionInstance.Session.CreateCriteria (typeof (EventItem.Items.EventItem)) .Add (Restrictions.In ( "AudienceList", myAudience.ID)) .List ();

Mas eu preciso do AudienceList e myAudience.ID ser o contrário não é? Eu tenho o ID público, mas necessidade de verificar que ele pode estar em uma lista de outros ids.

Obrigado novamente.

EDIT 2

A definição do EventItem é tal que uma das suas propriedades é um DetailCollection de IDs de audiência, eles são salvos no DB como uma lista de strings de IDs.

Foi útil?

Solução

EDIT:. Desfeito minha resposta anterior

Bem, parece que não há um modelo relacional verdade aqui assim que as coisas não serão tão bonita. Sem chaves estrangeiras e similares, não tenho certeza NHibernate será muito uso nesta situação (pelo menos para gerar uma consulta agradável).

Se todas as identificações de audiência para um único registro de eventos são armazenados em um único campo, você quer ter de usar um como o SQL ou fazê-lo no código. Buscar todos os EventItems e iterate através deles, verificando suas coleções AudienceList para o ID que você está procurando. Se você ir por esse caminho, pode ser melhor para criar um DTO para minimizar a quantidade de dados que você se mover. Algo como

session.CreateQuery("select new AudienceListDTO(e.AudienceList) from EventItems e").List();

Isso supondo que você só precisa informar o usuário que "este tipo de público ainda está em uso" e não apontar casos específicos. Caso contrário, você terá que adicionar mais dados.

Outras dicas

Você algo dizer assim?

class YourClass {
    List<int> theList;
}

IQueryable<YourClass> query = ...;
var result = from c in query where c.theList.Contains(value);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top