Pergunta

Estou tentando escrever uma consulta simples que requer um pseudônimo, pois é uma associação de muitos para muitos, mas não consigo fazer funcionar com as extensões do NH Lambda. Sempre me dá um erro de compilação, embora, até onde eu sei, seja exatamente o mesmo que a documentação e todos os exemplos que já vi online.

Funciona

var query = DetachedCriteria.For<County>()            
    .CreateCriteria("Zips", "zipAlias", JoinType.LeftOuterJoin)
    //.CreateCriteria<County>(x => x.Zips, 
    //                              () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

Não funciona

var query = DetachedCriteria.For<County>()            
    //.CreateCriteria("Zips", "zipAlias", JoinType.LeftOuterJoin)
    .CreateCriteria<County>(x => x.Zips, 
                                    () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

Resulta em uma construção Error 22 The name 'zipAlias' does not exist in the current context

Intellisense também destaca os criadores de create **<County>** Dizendo que não entende o método, no entanto, ele me mostra corretamente os nomes de parâmetros quando estou dentro do Parens.

Foi útil?

Solução

o documentação está cheio de exemplos úteis.

Sua zipAlias precisa ser uma variável no escopo local.

Zip zipAlias = null;
string zipCode = "";

var query = DetachedCriteria.For<County>()
    .CreateCriteria<County>(x => x.Zips, () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

Como o link de documentação downloads em vez de renderizar, copiei algumas seções.

Crie associação de critérios com alias
Usando a API original do iCriteria:

ICriteria before = CreateSession()
    .CreateCriteria(typeof(Person))
        .CreateCriteria("Children", "childAlias")
            .Add(Restrictions.Eq("Nickname", "test"));

Usando as extensões de lambda de Nibernate:

Child childAlias = null;
ICriteria after = CreateSession()
    .CreateCriteria(typeof(Person))
        .CreateCriteria((Person p) => p.Children, () => childAlias)
            .Add<Child>(c => c.Nickname == "test");

Crie critérios alias associados com alias e tipo de junção
Usando a API original do iCriteria:

ICriteria before = CreateSession()
    .CreateCriteria(typeof(Person), "personAlias")
        .CreateCriteria("personAlias.Children", "childAlias", JoinType.LeftOuterJoin)
            .Add(Restrictions.Eq("Nickname", "test"));

Usando as extensões de lambda de Nibernate:

Person personAlias = null;
Child childAlias = null;
ICriteria after = CreateSession()
    .CreateCriteria(typeof(Person), () => personAlias)
        .CreateCriteria(() => personAlias.Children, () => childAlias, JoinType.LeftOuterJoin)
            .Add<Child>(c => c.Nickname == "test");

Crie associação de critérios com alias e tipo de junção
Usando a API original do iCriteria:

DetachedCriteria before =
    DetachedCriteria.For<Person>()
        .CreateCriteria("Children", "childAlias", JoinType.LeftOuterJoin)
            .Add(Restrictions.Eq("Nickname", "test"));

Usando as extensões de lambda de Nibernate:

Child childAlias = null;
DetachedCriteria after =
    DetachedCriteria.For<Person>()
        .CreateCriteria((Person p) => p.Children, () => childAlias, JoinType.LeftOuterJoin)
            .Add<Child>(c => c.Nickname == "test");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top