Мне поручено создать список данных членов с помощью API NHibernate Criteria. Мне нужно включить подкачку и фильтрацию на основе флажков в пользовательском интерфейсе. Что делает это немного сложнее, так это то, что я не просто извлекаю данные из одной сущности, но эта сущность имеет отношение HasMany
к другим сущностям.
У меня сейчас ошибка:
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);]
Внутреннее исключение: значение \ "5554302 \" не относится к типу
\ "MyBusiness.MemberInfo \" и не может использоваться в этом универсальном
коллекция. Имя параметра: значение.
Прямо сейчас я просто смотрю на идентификатор участника, потому что я прокомментировал все остальные прогнозы в моем списке прогнозов. В противном случае в ошибке указывалось бы «Значение \» System.object [] \ "...
Код моих критериев:
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);
У меня также есть Criteria
для подсчета общего количества запросов, а не только для 1К. Это то же самое, что Criteria
, который я сделал для 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:
В моих проекциях была опечатка. Алиас переключил форму "MemberID" на "ManagedMemberID".