C# 使用NHibernate从分离的条件中选择alias属性

C# 使用NHibernate从分离的条件中选择alias属性,c#,sql-server,nhibernate,C#,Sql Server,Nhibernate,我基本上是在尝试在条件中创建这个sql查询。sql查询非常简单,但要使用条件查询执行此操作,我必须从分离的条件中选择一个属性。任何帮助都将不胜感激 Select y0_ from ( SELECT distinct TOP (1000) this_.Id as y0_, this_.InstrumentNumber as y1_ FROM [SearchRecorderInstrument] this_ inner join [SearchRecorderName]

我基本上是在尝试在条件中创建这个sql查询。sql查询非常简单,但要使用条件查询执行此操作,我必须从分离的条件中选择一个属性。任何帮助都将不胜感激

Select y0_ from 
(
    SELECT distinct TOP (1000) this_.Id as y0_, this_.InstrumentNumber as y1_ 
    FROM [SearchRecorderInstrument] this_ 
    inner join [SearchRecorderName] name1_ on this_.Id=name1_.SearchRecorderInstrument_id 
    inner join [NameType] nt4_ on name1_.NameType_id=nt4_.Id 
    inner join [SearchRecorderPropertyLegal] pl5_ on this_.Id=pl5_.SearchRecorderInstrument_id 
    inner join [DocumentType] dt2_ on this_.DocumentType_id=dt2_.Id 
    inner join [DocumentCategory] dc3_ on dt2_.DocumentCategory_id=dc3_.Id 
    WHERE name1_.FIPSCode = '26049' and name1_.LastName like 'smith%' and not (1=0) 
    ORDER BY this_.InstrumentNumber desc
) [b]
这就是我到目前为止所做的:

var criteria4 = DetachedCriteria.For(typeof(SearchRecorderInstrument), "instr");

            criteria4.CreateCriteria("instr.Names", "name", NHibernate.SqlCommand.JoinType.InnerJoin);

            criteria4.CreateCriteria("instr.DocumentType", "dt", NHibernate.SqlCommand.JoinType.InnerJoin);

            criteria4.CreateCriteria("dt.DocumentCategory", "dc", NHibernate.SqlCommand.JoinType.InnerJoin);

            criteria4.CreateCriteria("name.NameType", "nt", NHibernate.SqlCommand.JoinType.InnerJoin);

            criteria4.CreateCriteria("instr.PropertyLegals", "pl", NHibernate.SqlCommand.JoinType.InnerJoin);

            criteria4.Add(Expression.Eq("name.FIPSCode", fipsCode));

            criteria4.Add(Expression.Like("name.LastName", lastName, MatchMode.Start));

            if (partyIndicator != null && partyIndicator > 0)
            {
                criteria4.Add(Expression.Eq("name.PartyIndicator", partyIndicator));
            }

            if (firstName != null && firstName != string.Empty)
            {
                criteria4.Add(Expression.Like("name.FirstName", firstName, MatchMode.Start));
            }

            if (beginDate != null)
            {
                criteria4.Add(Expression.Ge("instr.RecordedDate", beginDate.Value));
            }

            if (endDate != null)
            {
                criteria4.Add(Expression.Lt("instr.RecordedDate", endDate.Value.AddDays(1)));
            }

            if (consFrom != null)
            {
                criteria4.Add(Expression.Ge("instr.Consideration", consFrom));
            }

            if (consTo != null)
            {
                criteria4.Add(Expression.Le("instr.Consideration", consTo));
            }

            if (documentTypeIds != null && documentTypeIds.Any())
            {
                disabledDocTypes = documentTypeIds.Where(x => !disabledDocTypes.Contains(x)).ToList();
                criteria4.Add(Expression.In("dt.Id", disabledDocTypes));
            }
            else
            {
                criteria4.Add(Expression.Not(Expression.In("dt.Id", disabledDocTypes)));
            }

            foreach (var item in legalSearchCriteria)
            {
                var val = item.Filter.FilterType.Value;
                switch (val)
                {
                    case "LIKE":
                        criteria.Add(Expression.Like("pl." + item.Filter.Field, item.Value));
                        break;
                    case ">=":
                        criteria.Add(Expression.Ge("pl." + item.Filter.Field, item.Value));
                        break;
                    case "<=":
                        criteria.Add(Expression.Le("pl." + item.Filter.Field, item.Value));
                        break;
                    case "=":
                        criteria.Add(Expression.Eq("pl." + item.Filter.Field, item.Value));
                        break;
                }
            }

            foreach (var item in sortDescriptors)
            {
                if (item.SortDescriptorDirection.ToString() == "ASC")
                {
                    criteria4.AddOrder(Order.Asc(item.ColumnName));
                }
                else
                {
                    criteria4.AddOrder(Order.Desc(item.ColumnName));
                }
            }

            criteria4.SetProjection(
                Projections.ProjectionList()
                .Add(Projections.Distinct(Projections.Property("instr.Id")), "InstrumentId")
                .Add(Projections.Property("instr.InstrumentNumber"), "InstrumentNumber"));

            criteria4.SetFirstResult(skip).SetMaxResults(rowsViewed);
var-criteria4=DetachedCriteria.For(typeof(SearchRecorderInstrument),“instr”);
createCriteria4.CreateCriteria(“instr.Names”、“name”、NHibernate.SqlCommand.JoinType.InnerJoin);
criteria4.CreateCriteria(“instr.DocumentType”、“dt”、NHibernate.SqlCommand.JoinType.InnerJoin);
criteria4.CreateCriteria(“dt.DocumentCategory”,“dc”,NHibernate.SqlCommand.JoinType.InnerJoin);
createCriteria4.CreateCriteria(“name.NameType”,“nt”,NHibernate.SqlCommand.JoinType.InnerJoin);
createCriteria4.CreateCriteria(“instr.PropertyLegals”、“pl”、NHibernate.SqlCommand.JoinType.InnerJoin);
准则4.添加(Expression.Eq(“name.FIPSCode”,FIPSCode));
标准4.Add(Expression.Like(“name.LastName”、LastName、MatchMode.Start));
if(partyIndicator!=null&&partyIndicator>0)
{
标准4.Add(Expression.Eq(“name.PartyIndicator”,PartyIndicator));
}
if(firstName!=null&&firstName!=string.Empty)
{
标准4.Add(Expression.Like(“name.FirstName”、FirstName、MatchMode.Start));
}
if(beginDate!=null)
{
标准4.添加(Expression.Ge(“instr.RecordedDate”,beginDate.Value));
}
如果(endDate!=null)
{
准则4.Add(Expression.Lt(“instr.RecordedDate”,endDate.Value.AddDays(1));
}
如果(consFrom!=null)
{
标准4.添加(表达式Ge(“仪器考虑”,consr.consFrom));
}
if(consTo!=null)
{
标准4.添加(表达式Le(“instr.constr.constr.constr.”);
}
if(documentTypeIds!=null&&documentTypeIds.Any())
{
disabledDocTypes=documentTypeIds.Where(x=>!disabledDocTypes.Contains(x)).ToList();
标准4.Add(Expression.In(“dt.Id”,disabledDocTypes));
}
其他的
{
标准4.Add(Expression.Not(Expression.In(“dt.Id”,disabledDocTypes));
}
foreach(legalSearchCriteria中的var项)
{
var val=item.Filter.FilterType.Value;
开关(val)
{
案例“LIKE”:
添加(表达式.Like(“pl.”+item.Filter.Field,item.Value));
打破
案例“>=”:
添加(Expression.Ge(“pl.”+item.Filter.Field,item.Value));
打破

案例“我假设您加入.CreateCriteria(“ForeignCollection”)
可以使用额外的重载来连接alias.CreateCriteria(“ForeignCollection”、“aliasname”)

在Where部分,您可以使用“aliasname”,例如“aliasname.Id”(即使这是DetachedCriteria中的名称,但是您的查询看起来不需要分离的条件)

更新

<>我想你应该考虑只选择分离标准中的仪器ID(即标准4)而不是仪器号。 接下来,您可以将criteria4用于子查询,例如:

Subqueries.PropertyEq("instr.InstrumentId", criteria4)
其中instr是标准5中的别名


使用criteria5选择相应的仪器编号

我对我的问题进行了一点编辑,我不确定如何在criteria5查询中使用分离条件的别名从criteria4分离条件中选择属性。如果您能将其放在示例表单中,那将非常好。谢谢我希望我能这样做,but为了对instrumentId进行区分并按仪器编号排序,我必须在select中包含这两个属性。好的,回到开头:查询的最终目的是什么?您想从数据库中获取什么?使用criteria4查询中的条件,我想获取不同仪器ID的列表。
Subqueries.PropertyEq("instr.InstrumentId", criteria4)