Question

Je suis chargé de générer une liste des données des membres à l'aide de l'API Nhibernate Criteria. J'ai besoin d'incorporer la pagination et le filtrage en fonction des cases à cocher dans l'interface utilisateur. Ce qui rend cela un peu plus complexe, c'est que je ne suis pas seulement récupéré des données d'une entité, mais cette entité a un HasMany relation avec d'autres entités.

J'ai actuellement une erreur:

Error executing multi Criteria: 
[SELECT DISTINCT TOP 1000 this_MemberID as y0_ 
 FROM _Members
 Left Outer Join _SubMemberTerms ON _SubMemberTerms.MemberID = this_.MemberID
 Left Outer Join _MemberTerms ON _MemberTerms.MemberID = this_.MemberID
 Left Outer Join _ScriptOption ON _ScriptOption.ID = _MemberTerms.ScriptOpID
 WHERE _MagazineID = 100
 AND 
    (_ScriptOption.MagID IN (1234,5678,9101,.....) 
        OR _ScriptOption.MemberID IS NULL
        OR _ScriptOption.Active = 0)
 AND
    (_SubMemberTerms._ScriptOpID IN (1234,5678,9101,.....)
        OR _SubMemberTerms.ID IS NULL);]

L'exception intérieure est: la valeur "5554302 " n'est pas de type "mybusiness.memberinfo " et ne peut pas être utilisée dans cette collection générique. Nom du paramètre: valeur.

En ce moment, je regarde simplement l'identité du membre parce que j'ai commenté toutes les autres projections de ma liste de projection. Sinon, l'erreur aurait déclaré "la valeur " System.Object [] "...

Mes critères Code:

var filteredList = CurrentSession.CreateCriteria<MemberInfo>("this_")
                   .SetProjection(Projections.Distinct(Projections.ProjectionList()
                   .Add(Projections.Alias(Projections.Property("ManagedMemberID"), "MemberID"))))
                   .Add(Restrictions.Eq("_MagazineID", (int)magID))
                   .CreateAlias("MemTermsList", "_MemberTerms", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                   .CreateAlias("_MemberTerms.ScriptOpInfo", "_ScriptOption", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                   .CreateAlias("SubTermsList", "_SubMemberTerms", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                   .SetFirstResult(startposition)
                   .SetMaxResults(1000);

J'ai aussi un Criteria Fabriqué pour obtenir le décompte de la requête totale et pas seulement le 1K est retourné. C'est la même chose que le Criteria J'ai fait pour filteredList.

//code for how I'm adding in the MagID's and ScriptOpId's
Disjunction magDisjunction = new Disjunction();
Disjunction subTermsDijunction = new Disjunction();
if(TheCheckBoxThatAppliesIsChecked)
{
    magDisjunction.Add(Restrictions.In("_ScriptOption.MagID", (List<int>)selectedMags))
                  .Add(Restrictions.IsNull("_MemberTerms.MemberID"))
                  .Add(Restrictions.Eq("_MemberTerms.Active", false));

    filteredList.Add(magDisjunction);
}
if(TheOtherCheckBoxThatAppliesIsChecked)
{
    subTermsDisjunction.Add(Restrictions.In("_SubMemberTerms.SciptOpID", (List<int>)selectedScriptOp))
                  .Add(Restrictions.IsNull("_SubMemberTerms.SubMemberTermsID"));

    filteredList.Add(subTermsDisjunction);
}

var finishedList = filteredList.Future<MemberInfo>().ToList<MemberInfo>();
var count = listCount.FutureValue<int>().Value;

EDIT: J'avais une faute de frappe dans mes projections.alias, le formulaire a changé de formulaire "membre", à "ManagedMemberId".

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top