NHibernate:如果参数不为null,则添加条件

NHibernate:如果参数不为null,则添加条件,nhibernate,criteria,Nhibernate,Criteria,我试图根据用户指定的参数检索订单列表(基本搜索功能)。用户将输入orderId或一组其他参数,这些参数将被打包成一条消息,并最终进入下面的方法。我的问题是,我如何只看实际有值的参数?因此,如果用户要输入接收日期范围和门店编号,并且所有其他字段都为空,我希望返回日期范围内接收的门店的订单,并忽略所有空参数。起初我想我可以使用连词,但我看不到一种忽略null参数的方法。然后,我开始将内容拆分为主表达式下面的if语句,但如果用户提供externalId,我不想查看这些条件。有没有一个简单的方法可以做到

我试图根据用户指定的参数检索订单列表(基本搜索功能)。用户将输入orderId或一组其他参数,这些参数将被打包成一条消息,并最终进入下面的方法。我的问题是,我如何只看实际有值的参数?因此,如果用户要输入接收日期范围和门店编号,并且所有其他字段都为空,我希望返回日期范围内接收的门店的订单,并忽略所有空参数。起初我想我可以使用连词,但我看不到一种忽略null参数的方法。然后,我开始将内容拆分为主表达式下面的if语句,但如果用户提供externalId,我不想查看这些条件。有没有一个简单的方法可以做到这一点

        public IList<Core.Order> GetOrderByCriteria
        (
        string ExternalId,
        int? Store,
        int? Status,
        DateTime? beforeTransmissionDate, DateTime? afterTransmissionDate,
        DateTime? beforeAllocationProcessDate, DateTime? afterAllocationProcessDate,
        DateTime? beforeReceivedDate, DateTime? afterReceivedDate
        )
    {
        try
        {
            NHibernate.ICriteria criteria = NHibernateSession.CreateCriteria(typeof(Core.Order))
                .Add(Expression.Or
                        (
                        Expression.Like("ExternalId", ExternalId),
                        Expression.Conjunction()
                            .Add(Expression.Between("ReceivedDate", beforeReceivedDate, afterReceivedDate))
                            .Add(Expression.Between("TransmissionDate", beforeTransmissionDate, afterTransmissionDate))
                            .Add(Expression.Between("AllocationProcessDate", beforeAllocationProcessDate, afterAllocationProcessDate))
                        )
                     );

            if(Store.HasValue)
                criteria.Add(Expression.Eq("Status", Status));

            if(Status.HasValue)
                criteria.Add(Expression.Eq("Store", Store));


            return criteria.List<Core.Order>();
        }
        catch (NHibernate.HibernateException he)
        {
            DataAccessException dae = new DataAccessException("NHibernate Exception", he);
            throw dae;
        }
    }
public IList GetOrderByCriteria
(
字符串外部化,
国际商店,
int?状态,
日期时间?传输日期前,日期时间?传输日期后,
DateTime?在AllocationProcessDate之前,DateTime?在AllocationProcessDate之后,
日期时间?接收日期前,日期时间?接收日期后
)
{
尝试
{
NHibernate.ICriteria criteria=NHibernateSession.CreateCriteria(typeof(Core.Order))
.添加(表达式)或
(
表达式。例如(“ExternalId”,ExternalId),
表达式.连词()
.Add(表达式.Between(“ReceivedDate”、beforeceiveddate、afterReceivedDate))
.Add(表达式.Between(“TransmissionDate”,在TransmissionDate之前,在TransmissionDate之后))
.Add(表达式.Between(“AllocationProcessDate”,在AllocationProcessDate之前,在AllocationProcessDate之后))
)
);
if(Store.HasValue)
添加(表达式.Eq(“状态”,状态));
if(Status.HasValue)
添加(Expression.Eq(“Store”,Store));
返回条件。List();
}
捕获(NHibernate.hibernate异常he)
{
DataAccessException dae=新的DataAccessException(“NHibernate异常”,he);
投掷dae;
}
}

不久前,我不得不做类似的事情。我很确定你可以修改它来满足你的需要

    private ICriteria AddSearchCriteria(ICriteria criteria, string fieldName, string value)
    {

        if (string.IsNullOrEmpty(fieldName))
            return criteria;

        if(string.IsNullOrEmpty(value))
            return criteria;

        criteria.Add(Expression.Like(fieldName, "%" + value + "%"));

        return criteria;
    }
调用该方法的代码最终如下所示:

var query = session.CreateCriteria(typeof (User));

AddSearchCriteria(query, "FirstName", form["FirstName"]);
AddSearchCriteria(query, "LastName", form["LastName"]);

var resultList = new List<User>();
query.List(resultList);
return resultList;
var query=session.CreateCriteria(typeof(User));
AddSearchCriteria(查询,“名字”,表格[“名字]);
AddSearchCriteria(查询“LastName”,表格[“LastName”]);
var resultList=新列表();
查询列表(resultList);
返回结果列表;

让函数来决定输入是否有效,以及是返回未修改的ICriteria还是在返回之前添加另一个表达式。

我最终放弃了整个连接,并用下面的代码替换了try块中的代码。我还使用了连接,减少了数据库访问的数量,减少了所需的代码量

NHibernate.ICriteria criteria = NHibernateSession.CreateCriteria(typeof(Core.Order));

            if (!String.IsNullOrEmpty(ExternalId))
            {
                criteria.Add(Expression.Like("ExternalId", ExternalId));
            }

            if (beforeReceivedDate != null && afterReceivedDate != null)
                criteria.Add(Expression.Between("ReceivedDate", beforeReceivedDate, afterReceivedDate));

            if (beforeTransmissionDate != null && afterTransmissionDate != null)
                criteria.Add(Expression.Between("TransmissionDate", beforeTransmissionDate, afterTransmissionDate));

            if (beforeAllocationProcessDate != null && afterAllocationProcessDate != null)
                criteria.Add(Expression.Between("AllocationProcessDate", beforeAllocationProcessDate, afterAllocationProcessDate));

            if (Store.HasValue)
                criteria.CreateCriteria("Store", "Store").Add(Expression.Eq("Store.LocationNumber", Store.Value));

            return criteria.List<Core.Order>();
NHibernate.ICriteria-criteria-criteria-criteria=NHibernateSession.CreateCriteria(typeof(Core.Order));
如果(!String.IsNullOrEmpty(ExternalId))
{
添加(Expression.Like(“ExternalId”,ExternalId));
}
if(beforeceiveddate!=null和&afterReceivedDate!=null)
添加(表达式.Between(“ReceivedDate”、beforeceiveddate、afterReceivedDate));
if(传输前!=null和传输后!=null)
标准。添加(表达式。介于(“TransmissionDate”,在TransmissionDate之前,在TransmissionDate之后));
if(beforeAllocationProcessDate!=null和&afterAllocationProcessDate!=null)
添加(表达式.Between(“AllocationProcessDate”,在AllocationProcessDate之前,在AllocationProcessDate之后));
if(Store.HasValue)
CreateCriteria(“Store”、“Store”).Add(Expression.Eq(“Store.LocationNumber”,Store.Value));
返回条件。List();

我唯一不喜欢的是我的很多条件不是字符串,我不想转换所有参数。