如何在一个查询中完成所有操作? NHibernate的

时间:2011-04-18 22:33:30

标签: nhibernate

我有一个ID列表,我希望在一个查询中获取所有行。作为对象列表(所以产品列表或其他)。

我试过

public List<TableA> MyMethod(List<string> keys)
{
    var query = "SELECT * FROM TableA WHERE Keys IN (:keys)";
    var a = session.CreateQuery(query).SetParameter("keys", keys).List();
   return a; // a is a IList but not of TableA. So what do I do now?
}

但我无法弄清楚如何将其作为对象列表返回。这是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

List<TableA> result = session.CreateQuery(query)
                             .SetParameterList("keys", keys)
                             .List<TableA>();

答案 1 :(得分:0)

如果“:keys”的数量超过1000(oracle对其他dbs不确定),则此查询可能存在限制因此我建议使用ICriteria而不是CreateQuery- native sqls。

做这样的事,

[TestFixture]
    public class ThousandIdsNHibernateQuery
    {
        [Test]
        public void TestThousandIdsNHibernateQuery()
        {
            //Keys contains 1000 ids not included here.
            var keys = new List<decimal>();

            using (ISession session = new Session())
            {
                var tableCirt = session.CreateCriteria(typeof(TableA));


                if (keys.Count > 1000)
                {
                    var listsList = new List<List<decimal>>();

                    //Get first 1000.
                    var first1000List = keys.GetRange(0, 1000);

                    //Split next keys into 1000 chuncks.
                    for (int i = 1000; i < keys.Count; i++)
                    {
                        if ((i + 1)%1000 == 0)
                        {
                            var newList = new List<decimal>();
                            newList.AddRange(keys.GetRange(i - 999, 1000));
                            listsList.Add(newList);
                        }

                    }

                    ICriterion firstExp = Expression.In("Key", first1000List);
                    ICriterion postExp = null;

                    foreach (var list in listsList)
                    {
                        postExp = Expression.In("Key", list);
                        tableCirt.Add(Expression.Or(firstExp, postExp));
                        firstExp = postExp;

                    }

                    tableCirt.Add(postExp);
                }
                else
                {
                    tableCirt.Add(Expression.In("key", keys));

                }

                var results = tableCirt.List<TableA>();
            }

        }
    }