我有这个
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'
答案 0 :(得分:0)
根据您对此主题的其他问题,我建议使用QueryOver:
以下查询适用于listId == null
和listId.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==1
和listId.Count==0
我根本不会运行查询:为什么当你知道没有结果会返回时往返?