我有一个id列表,我需要获取与列表中每个id相对应的所有记录。
下面是示例代码
public List<Items> LoadLineItemByPkeys(IEnumerable<long> ItemId)
{
var ItemList = CurrentSession.Query<LineItem>()
.Where(l =>itemId.Contains(l.id))
.ToList();
return ItemList ;
}
但我得到了例外
NHibernate.dll中发生了'NHibernate.Exceptions.GenericADOException'类型的异常但未在用户代码中处理
内部异常: -
无法将参数值从WhereSelectArrayIterator`2转换为Int64。 请帮帮我。
当我在LINQPad中执行相同的查询时,我得到了结果。
答案 0 :(得分:2)
由于您如何传递ID,您可能会遇到麻烦。您可能会发现将该序列转换为列表或数组会有所帮助:
// Various names to be more conventional/readable
public List<Items> LoadLineItemsById(IEnumerable<long> ids)
{
var idList = ids.ToList();
return CurrentSession.Query<LineItem>()
.Where(item => idList.Contains(item.Id))
.ToList();
}
答案 1 :(得分:1)
如果我没有误会你就不能使用contains方法。
您必须使用.IsIn()
public List<Items> LoadLineItemByPkeys(IEnumerable<long> itemIds)
{
var lineItemList = CurrentSession.QueryOver<LineItem>()
.WhereRestrictionOn(l =>l.id).IsIn(itemIds).List()
.ToList();
return lineItemList ;
}
这将生成一个带有in运算符的sql语句。请注意此运算符的限制。某些数据库的参数限制为1000,其他的参数为2000等。