如何在MVC3 nhibernate中迭代Icollection

时间:2012-04-13 06:14:20

标签: asp.net-mvc-3 model-view-controller nhibernate drop-down-menu

我正在使用mvc3开发一个应用程序。
我有两个下拉菜单,根据第一个下拉列表中选择的值,第二个下拉列表已填充。 第一个下拉列表是课程,在选择的基础上,第二个下拉列表填充了课程可用的状态。

如果课程是“MCA”,那么州应该是马哈拉施特拉邦,拉贾斯坦邦等等。 为此,我写了一个工作正常的ajax函数。 但问题是我无法一次获取多个状态,即我一次只能获取一个状态。

我编写了以下代码来获取州名:

HobbyHomeAdress表包含通过其他方法获取的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;
    }

1 个答案:

答案 0 :(得分:1)

您正在为hobbyhomeaddresslist中的每个州重新创建省级州集合。所以你最终得到一个带有单个条目的集合,通常是最后一个。相反,您应该预先创建集合,并在检索项目后,将其添加到该集合中。

...剪断

    ...
    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();

    }
    ...

更新:使用Disjunction进行单一查询。

    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();

    }

如果查看生成的SQL,您现在应该看到一个带有多个where子句的select,而不是带有一个where子句的多个select。