列表id的linq查询

时间:2016-01-13 08:21:14

标签: c# linq nhibernate

我有一个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中执行相同的查询时,我得到了结果。

2 个答案:

答案 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等。