Asp.net mvc 3 如何在MVC3 nhibernate中迭代Icollection

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。 然后我将

我正在用mvc3开发一个应用程序。
我有两个下拉列表,根据第一个下拉列表中选择的值填充第二个下拉列表。 第一个下拉列表是课程,根据所选课程,第二个下拉列表填充课程可用的州。

例如,如果课程是“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提到的问题。