Domanda

Ho una semplice query LINQ NHibernate che sta tornando più risultati del previsto:

  var result = (from foo in session.Linq<Foo>()
                      where foo.High.ID == High.ID
                      select foo).ToArray();

Foo assomiglia a questo:

public class Foo : DomainLayerSuperType
{
  // ...other members omitted for clarity
  protected IList<Bar> associatedBars;

}

Il mio problema è ho un Foo duplicato per ogni bar della collezione 'associatedBars'. Quindi, se ci sono 20 bar della collezione per un'istanza di Foo, ottengo 20 casi Foo, ciascuno con 20 bar.

Mapping per Foo: (FluentNhibernate)

//other mappings omitted
HasMany<Bar>(x => x.AssociatedBars)
                .Access.CamelCaseField()
                .AsBag()
                .Table("dbo.Bar")
                .KeyColumn("FooID")
                .Cascade.AllDeleteOrphan()
                .Inverse()
                .Fetch.Join(); //eager load

Quando eseguo questa query equivalente HQL, il problema non si verifica:

var query = new StringBuilder();
query.AppendFormat("select foo from Foo foo where foo.High.ID = {0}", High.ID);
var result = session.CreateQuery(query.ToString()).List<Foo>().ToArray();

Inoltre, quando cambio il mapping per Foo, da utilizzare pigro carico per AssociatedBars, il problema non si verifica.

Tutte le idee? Inoltre, dove è meglio forum per Nh Linq? Non riuscivo a trovare uno così postato qui!

È stato utile?

Soluzione

Il problema è che fornitore di LINQ corrente si basa su criteri di query. Quando si impostano proprietà Fetch.Join nella mappatura allora se controlli query SQL che viene generato si vedrà unirsi lì. Si sono sempre ripetuto risultati siccome di questo aderire.

In HQL NHibernate utilizza modo diverso per la generazione di query SQL e SQL sarà molto bravo simile al vostro HQL, ecco perché non c'è aderire e senza colonne ripetuti.

Per interrogazione liq si può provare a utilizzare estensione distinti per ottenere risultati unici solo da una query.

C'è un href="http://blogs.imeta.co.uk/sstrong/archive/2009/10/22/791.aspx" rel="nofollow noreferrer"> progetto attualmente in fase di sviluppo per creare un provider LINQ sulla base di HQL parser

scroll top