将零集合传入hql请求时该怎么办?

时间:2011-04-19 03:53:29

标签: nhibernate

我有这个

     public List<TableA> Get(Guid Id, List<int> listId)
    {
        const string query = "FROM TableA WHERE MyListColumn in (:listId) AND Id in (:Id)";
        return session.CreateQuery(query).SetParameterList("listId", listId).SetParameter("Id",Id).List<TableA>().ToList();
    }

我想知道如果键数等于零该怎么办?当使用linq方式时,它将返回一个空的TableAs列表。我能想到的唯一方法是“if”语句,但我想知道在我这样做之前是否还有其他方法,因为我不想在我的方法中使用真正的逻辑,因为它是一个repo方法。

if(listId.Count == 0){..}

我收到此错误

  '/'应用程序中的服务器错误。一个   空参数列表生成错误   SQL;参数名称'listId'

2 个答案:

答案 0 :(得分:0)

根据您对此主题的其他问题,我建议使用QueryOver: 以下查询适用于listId == nulllistId.Count == 0

public List<TableA> Get(List<int> listId)
{
    return session.QueryOver<TableA>()
            .Where(Restrictions.In(
                Projections.Property<TableA>(e => e.Id), 
                listId ?? (new List<int>() { }))).List().ToList();
}

我删除了Guid Id参数,因为这在这里没有多大意义。

修改

是的,NHibernate有几种方法可以查询数据库(纯SQL,HQL,ICriteria,QueryOver和NHibernate.Linq)。所有这些都有其优点和缺点,我通常会尝试使用最适合这项工作的方法。

在此我建议使用QueryOver而不是HQL,因为您获得了完整的Intellisense和编译器支持。此外,如果列表为空,QueryOver不会抛出错误(它将转换为WHERE 1=0)。正如捷豹写的那样,在这种情况下,您也可以返回一个空列表,而无需转到数据库。

当QueryOver或ICriteria无法获得我想要的结果时,我通常只使用HQL。 Linq提供程序仍缺少某些功能,因此目前仅适用于相当简单的查询。

您也可以使用Linq执行上述查询。这是上面代码的NHibernate.Linq版本:(这适用于NHibernate 3.1,未在以前的版本中测试过)

List<int> idList = new List<int>(){ 1, 2 };

// if idList is null this will still throw an error
var result = session.Query<TableA>()
               .Where(e => idList.Contains(e.Id)).ToList();

答案 1 :(得分:0)

我认为if块是正确的,因为它不是“程序逻辑”:它是查询生成。

也就是说,我个人将查询签名更改为MyListColumn =:id listId.Count==1listId.Count==0 我根本不会运行查询:为什么当你知道没有结果会返回时往返?