问题描述
|
我有一个Ids列表,我想在一个查询中返回所有行。作为对象列表(因此是产品列表或其他)。
我试过了
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?
}
但我不知道如何将其作为对象列表返回。这是正确的方法吗?解决方法
List<TableA> result = session.CreateQuery(query)
.SetParameterList(\"keys\",keys)
.List<TableA>();
,但是,如果\“:keys \”的数量超过1000(如果oracle无法确定其他数据库的数量),则此查询中可能存在限制,因此我建议使用ICriteria代替CreateQuery-native sql。
做这样的事情
[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>();
}
}
}