Asp.net mvc 3 如何在MVC3 nhibernate中迭代Icollection
我正在用mvc3开发一个应用程序。Asp.net mvc 3 如何在MVC3 nhibernate中迭代Icollection,asp.net-mvc-3,model-view-controller,nhibernate,drop-down-menu,Asp.net Mvc 3,Model View Controller,Nhibernate,Drop Down Menu,我正在用mvc3开发一个应用程序。 我有两个下拉列表,根据第一个下拉列表中选择的值填充第二个下拉列表。 第一个下拉列表是课程,根据所选课程,第二个下拉列表填充课程可用的州。 例如,如果课程是“MCA”,那么州应该是马哈拉施特拉邦、拉贾斯坦邦等等。 为此,我编写了一个ajax函数,该函数运行良好。 但问题是我不能一次获取多个状态,也就是说,我一次只能获取一个状态 我编写了以下代码来获取州名称: HobbyHomeAddress表包含我通过其他方法获取的ProvincialStateID。 然后我将
我有两个下拉列表,根据第一个下拉列表中选择的值填充第二个下拉列表。 第一个下拉列表是课程,根据所选课程,第二个下拉列表填充课程可用的州。
例如,如果课程是“MCA”,那么州应该是马哈拉施特拉邦、拉贾斯坦邦等等。 为此,我编写了一个ajax函数,该函数运行良好。 但问题是我不能一次获取多个状态,也就是说,我一次只能获取一个状态 我编写了以下代码来获取州名称: HobbyHomeAddress表包含我通过其他方法获取的ProvincialStateID。 然后我将该值与ProvincialState表中ProvincialStateID中的值进行比较,并获取该表的数据,但使用它只会给出最后一条记录
public ICollection<ProvincialState> FetchStateByStateid(ICollection<HobbyHomeAddress> hobbyhomeaddresslist)
{
log.Debug("Start");
ISession session = DataAccessLayerHelper.OpenWriterSession();
ITransaction transaction = session.BeginTransaction();
ICollection<ProvincialState> provincialstate = null;
try
{
foreach (var state in hobbyhomeaddresslist)
{
provincialstate = session.CreateCriteria(typeof(ProvincialState))
.Add(Expression.Eq("ProvincialStateID", state.ProvincialState.ProvincialStateID))
.List<ProvincialState>();
}
transaction.Commit();
}
catch (SessionException ex)
{
if (transaction != null && transaction.IsActive)
transaction.Rollback();
log.Error(ex);
provincialstate = null;
}
finally
{
if (transaction != null)
transaction.Dispose();
if (session != null && session.IsConnected)
session.Close();
log.Debug("End");
}
return provincialstate;
}
public ICollection FetchStateByStateid(ICollection hobbyhomeaddresslist)
{
log.Debug(“启动”);
ISession session=DataAccessLayerHelper.OpenWriterSession();
ITransaction事务=session.BeginTransaction();
ICollection provincialstate=null;
尝试
{
foreach(hobbyhomeaddresslist中的var状态)
{
provincialstate=session.CreateCriteria(typeof(provincialstate))
.Add(Expression.Eq(“ProvincialStateID”,state.ProvincialState.ProvincialStateID))
.List();
}
Commit();
}
捕获(SessionException ex)
{
if(transaction!=null&&transaction.IsActive)
transaction.Rollback();
日志错误(ex);
provincialstate=null;
}
最后
{
if(事务!=null)
transaction.Dispose();
if(session!=null&&session.IsConnected)
session.Close();
log.Debug(“结束”);
}
返回省州;
}
您正在为hobbyhomeaddresslist中的每个州重新创建provincialstate集合。因此,最终的集合只有一个条目,通常是最后一个条目。相反,您应该提前创建集合,并在检索项目后将其添加到该集合中
…剪断
...
List<ProvincialState> provincialstate = new List<ProvincialState>();
try
{
foreach (var state in hobbyhomeaddresslist)
{
var list = session.CreateCriteria(typeof(ProvincialState))
.Add(Expression.Eq("ProvincialStateID", state.ProvincialState.ProvincialStateID))
.List<ProvincialState>();
provincialstate.AddRange(list);
}
transaction.Commit();
}
...
。。。
List provincialstate=新列表();
尝试
{
foreach(hobbyhomeaddresslist中的var状态)
{
var list=session.CreateCriteria(typeof(ProvincialState))
.Add(Expression.Eq(“ProvincialStateID”,state.ProvincialState.ProvincialStateID))
.List();
省政府地址范围(列表);
}
Commit();
}
...
更新:使用析取的单个查询
IList<ProvincialState> provincialstate = null;
Disjunction dj = new Disjunction();
try
{
foreach (var state in hobbyhomeaddresslist)
{
dj.Add(Expression.Eq("ProvincialStateID", state.ProvincialState.ProvincialStateID));
}
provincialstate = session.CreateCriteria(typeof(ProvincialState))
.Add(dj)
.List<ProvincialState>();
transaction.Commit();
}
IList provincialstate=null;
析取dj=新析取();
尝试
{
foreach(hobbyhomeaddresslist中的var状态)
{
dj.Add(Expression.Eq(“ProvincialStateID”,state.ProvincialState.ProvincialStateID));
}
provincialstate=session.CreateCriteria(typeof(provincialstate))
.Add(dj)
.List();
Commit();
}
如果您查看生成的SQL,现在应该会看到一个包含多个where子句的select,而不是一个包含多个where子句的select。thanx 4回答我理解您的解释,但我没有得到任何函数作为'AddRange()“我必须为它添加一些东西吗?”你知道这是在为n+1找麻烦query@user1274646:您是否将provincialstate的定义从ICollection更改为List?ICollection没有AddRange,List有。列表实现ICollection,因此您可以将列表作为ICollection返回。@GarlandGreene是的,我更改了它…IList provincialstate=new List();但我还是写了provincialstate.AddRange(列表),它不认识它。我得到的只是Add(),我可以用它来代替这个吗???不是IList,List。但是,由于当前一次只加载一个项目,因此也可以使用Add()添加单个项目。您还可以使用析取中的几个EqExpression(相当于OR的NHibernate标准API)一次加载所有项。这样,您将获得一个集合,而只有一个选择。这也将绕过Baz1nga提到的问题。