Даже если он работает как HQL, Nhibernate Linq присоединяется к подразделению с группировкой и использованием группировкC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Даже если он работает как HQL, Nhibernate Linq присоединяется к подразделению с группировкой и использованием группировк

Сообщение Anonymous »

мне нужно написать nhibernate Query в качестве синтаксиса LINQ, чтобы произвести iqueryable, но у меня есть некоторые проблемы, даже если он работает в качестве запроса HQL. Мне нужно использовать iquerayable для другой цели, так как HQL не является результатом как iqueryable. Также мне это нужно в качестве исполнительского средства, используя соединения, а не подложки, где или выбирают предложения. Позвольте мне сначала поделиться игровой площадкой.

Код: Выделить всё

public class Main
{
public virtual int Id { get; }
public virtual int? ColInt { get; set; }
public virtual string? ColString { get; set; }
}
public class ManyMain
{
public virtual int Id { get; }
public virtual int MainId { get; set; }
public virtual int? ColInt { get; set; }
public virtual string? ColString { get; set; }
public virtual DateTime? ColDateTime { get; set; }
}
public class MainMapping : ClassMapping
{
public MainMapping()
{
Table("main");
Id(x => x.Id, m =>
{
m.Column(cm =>
{
cm.Name("id");
cm.NotNullable(true);
});
m.Generator(Generators.Identity);
m.Access(Accessor.Backfield);
});

Property(x => x.ColInt, m =>
{
m.Column("col_int");
});
Property(x => x.ColString, m =>
{
m.Column("col_string");
});
}
}
public class ManyMainMapping : ClassMapping
{
public ManyMainMapping()
{
Table("many_main");
Id(x => x.Id, m =>
{
m.Column(cm =>
{
cm.NotNullable(true);
});
m.Generator(Generators.Identity);
m.Access(Accessor.Backfield);
});

Property(x => x.MainId, m =>
{
m.Column("main_id");
m.NotNullable(true);
});

Property(x => x.ColInt, m =>
{
m.Column("col_int");
});
Property(x => x.ColString, m =>
{
m.Column("col_string");
});
Property(x => x.ColDateTime, m =>
{
m.Column("col_datetime");
});
}
}
< /code>
[b] my configuration: < /strong>

nhibernate v5.5.2

npgsql v9.0.3 < /p>
var cfg = new Configuration();
var mapper = new ModelMapper();
var mappings = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => t.GetBaseTypes().Any(bt => bt.IsGenericType &&  bt.GetGenericTypeDefinition().IsAssignableTo(typeof(PropertyContainerCustomizer))))
.ToArray();
mapper.AddMappings(mappings);
var mapCfg = mapper.CompileMappingForAllExplicitlyAddedEntities();
cfg.AddMapping(mapCfg);
cfg.DataBaseIntegration(db =>
{
db.ConnectionString = connstr;
db.Dialect();
db.Driver();
db.LogSqlInConsole = true;
db.LogFormattedSql = false;
});
В этой ситуации я написал запрос HQL и, кажется, работает для меня, как и ожидалось.

Код: Выделить всё

var q2 = session.CreateQuery("""
select m, mm3
from Main m
left join (
select mm, mm2.mindt from ManyMain mm
inner join (
SELECT MainId, min(ColDateTime) as mindt, max(ColDateTime) as maxdt
FROM ManyMain
GROUP BY MainId
) as mm2
on mm2.MainId = mm.MainId
and mm2.maxdt = mm.ColDateTime
and mm.Id = (
select MIN(Id)
from ManyMain
where MainId = mm.MainId
and ColDateTime = mm2.maxdt
)
) mm3
on m.id = mm3.MainId;
""");

var r = q2.List();
sql [/b]

Код: Выделить всё

select main0_.id as col_4_0_,
subquery5_.id1_1_,
main0_.id as id1_0_1_,
main0_.col_int as col2_0_1_,
main0_.col_string as col3_0_1_,
subquery5_.main2_1_,
subquery5_.col3_1_,
subquery5_.col4_1_,
subquery5_.col5_1_,
subquery5_.col_3_0_,
subquery5_.col_1_0_
from main main0_
left outer join (
select manymain1_.Id as col_3_0_,
subquery3_.col_1_0_,
manymain1_.Id as id1_1_,
manymain1_.main_id as main2_1_,
manymain1_.col_int as col3_1_,
manymain1_.col_string as col4_1_,
manymain1_.col_datetime as col5_1_
from many_main manymain1_
inner join (
select manymain2_.main_id as col_0_0_,
min(manymain2_.col_datetime) as col_1_0_,
max(manymain2_.col_datetime) as col_2_0_
from many_main manymain2_
group by manymain2_.main_id
) subquery3_ on (
subquery3_.col_0_0_ = manymain1_.main_id
and subquery3_.col_2_0_ = manymain1_.col_datetime
and manymain1_.Id =(
select max(manymain4_.Id)
from many_main manymain4_
where manymain4_.main_id = manymain1_.main_id
and manymain4_.col_datetime = subquery3_.col_2_0_
)
)
) subquery5_ on (main0_.id = subquery5_.main2_1_)
, но когда я пробую то же самое, используя API LINQ, чтобы получить тот же SQL, я получаю некоторые ошибки в этой ситуации. , похоже, использует проекцию группировки внутри ключа соединения причин, которые не могут их разрешить. Когда я использую проекцию группировки только в проекции результатов соединения, он пытается бросить некоторое количество Int32 в Nullable DateTime при получении результатов в память и кажется ошибочной.

Код: Выделить всё

var q0 = session.Query()
.GroupBy(x => x.MainId)
.Select(g => new
{
MainId = g.Key,
MinRun = g.Min(x => x.ColDateTime),
MaxRun = g.Max(x => x.ColDateTime),
});

var q1 = session.Query()
.Join(q0,
o => new
{
o.MainId,
MaxRun = o.ColDateTime,
},
i => new
{
i.MainId,
i.MaxRun
},
(o, i) => new
{
ManyMain = o,
i.MinRun,
i.MaxRun
})
.Where(x => x.ManyMain.Id == session.Query()
.Where(y => y.MainId == x.ManyMain.MainId && y.ColDateTime == x.MaxRun)
.Min(y => y.Id));

var FirstJoinResult = q1.ToArray();

// var res = session.Query()
//     .LeftJoin(q1,
//         o => o.Id,
//         i => i.ManyMain.MainId,
//         (o, i) => new
//         {
//             Main = o,
//             JoinResult = i
//         });
< /code>
[b] ошибка 1 при использовании maxrun in join key < /strong> < /p>

 nhibernate.queryexception: не может разрешить свойство: maxrun of:
subquery at < /strong>
nhibernate.persister.entity.subquerypropertymapping.totype(string
propertyname) at
nhibernate.hql.ast.antlr.tree.fromelementType.getPropertyType(String
PropertyNam /> nhibernate.hql.ast.antlr.tree.fromelement.getPropertyType(string
PropertyName, String PropertyPath) at
Nhibernate.hql.ast.antlr.tree.dotnode.preparelhs () at
nhibernate.hql.ast.antlr.tree.dotnode.resolve(boolean generatejoin,
boolean implitejoin, string classalias, iastnode parent) at
/> nhibernate.hql.ast.antlr.tree.fromReferenceNode.resolve(boolean
Generatejoin, Boolean Imploicejoin, String classalias) at
nhibernate.hql.ast.antlr.tree.fromreerencenode.resolve. /> nhibernate.hql.ast.antlr.hqlsqlwalker.resolve(iastnode node) at
nhibernate.hql.ast.Antlr.hqlsqlAlker.exprors.exprors.exprors.exprors.exprors. />NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.comparisonExpr() 2    at
NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.logicalExpr()    at
NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.withClause()    at
nhibernate.hql.ast.antlr.hqlsqlwalker.handlewithfragment(fromelement
fromelement, iastnode hqlwithnode) --- Конец внутреннего стека исключений
trace --- at
nhibernate.hql.ast.antlr.hqlsqlwalker.handlewithfragment(fromelement
fromement, iastnode hqlwithnode) at
nhibernate.hql.ast.antlr.hqlsqlwalker.createjoinsubery. псевдоним, int32 jointype, iastnode with) at
nhibernate.hql.ast.antlr.hqlsqlwalker.Fromelement () at
Nhibernate.hql.ast.antlr.hqlsqlwalker.fromelementlist () at
nhibernate.hql.ast.antlr.hqlsqlwalker.fromclaus /> Nhibernate.hql.ast.antlr.hqlsqlwalker.query () at
nhibernate.hql.ast.antlr.hqlsqlwalker.Statement () at.thql.ast.Astlr.hqlsql />NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate()    at
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Analyze(String
collectionRole)    at
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary2 replacements, Boolean shallow, String collectionRole)    at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary< /code> 2
Replacements, Boolean Flomow) at
nhibernate.hql.ast.antlr.astquerytranslatorfactory.creequerytranslators(iqueryexpression
QueryExpression, iastnode Astic2 filters, ISessionFactoryImplementor factory)    at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary< /code> 2
фильтры, фабрика IsessionFactoryImplementor) AT
nhibernate.engine.query.queryexpressionPlan.createTranslators(iqueryExpression
QueryExpression, String CollectionRole, Boolean мелкий, жидкий2 enabledFilters, ISessionFactoryImplementor factory)    at NHibernate.Engine.Query.QueryExpressionPlan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary< /code> 2 enabledfilters,
isessionFactoryImplementor Factory) на
nhibernate.engine.query.queryplancache.gethqlqueryplan(iequeryexpression
2 enabledFilters)    at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)    at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)    at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query)    at NHibernate.Linq.DefaultQueryProvider.ExecuteList[TResult](Expression expression)    at NHibernate.Linq.NhQueryable
1.system.collections.generic.ienumerable.getEnumerator ()

ошибка 2, когда Maxrun прокомментировал из ключа Join и в том, где подковывается после присоединения. Сгенерировано SQL, но результаты нельзя прочитать из db < /strong> < /p>

nhibernate: select manymain0_.id as col_3_0_, manymain0_.id as id1_1 _,
manymain0_.main_id as main2_1_1_. /> manymain0_.col_string as col4_1_, manymain0_.col_datetime as col5_1 _,
subquery2_.col_0_0_, subquery2_.col_1_0_, subquery2_.col_0_0_ из
mary_main0 как
col_0_0_, min (manymain1_.col_datetime) как col_1_0 _,
max(manymain1_.col_datetime) как col_2_0_ от many_main manymain1_
group by manymain1_.main_id) subquery2_ на
/>(subquery2_.col_0_0_=manymain0_.main_id), где manymain0_.id = (select
min(manymain3_.id) из many_main manymain3_) Исключение:
'nhibernate.exceptions.genericadexception 'in nhibernate. Nhibernate.exceptions.genericadoException: не может
не выполнять запрос [sql: sql недоступен] --->
**систем.

Код: Выделить всё

3[System.Int32,System.Nullable
1[System.DateTime],System.Nullable

Код: Выделить всё

1[System.DateTime]]'.** at lambda_method2(Closure, Object[])    at NHibernate.Linq.ResultTransformer.TransformTuple(Object[] tuple, String[] aliases)    at NHibernate.Loader.Hql.QueryLoader.GetResultList(IList results, IResultTransformer resultTransformer)    at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)    at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet< /code> 1 Queryspaces) at
nhibernate.loader.hql.queryloader.list(IsessionImplomementor Session,
Queryparameters Queryparameters) at
nhibernate.hql.ast.Antlr.QueryTransLatorMpl.Lyslator. Queryparameters) at
nhibernate.engine.query.hqlqueryplan.performlist(queryparameters
Queryparameters, сеанс iSessionImplementor, результаты ilist) at
nhibernate.impsessionImpl.list(iqueryExpression,
Результаты ILIST, Object
FilterConnection) --- конец внутреннего трассировки стека исключений --- at
nhibernate.impl.sessionImpl.list(iqueryExpression QueryExpression,
Queryparameters Queryparameters, результаты илиста, объект
filterConnection) у
nhibernate.impl.sessionImpl.list(iequeryExpression QueryExpression,
Queryparameters Queryparameters, результаты ILIST) на
nhibernate.impl.abstractsessionImpl.list= Queryexpression,
queryparameters paremreters) at
queryparameters).  /> nhibernate.impl.abstractqueryimpl2.listt at
nhibernate.linq.defaultqueryprovider.executelist= tresult^ • Expression
> at
nhibernate.linq.nhqueryable1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Linq.Enumerable.g__EnumerableToArray|314_0[TSource](IEnumerable
1
source)

Есть ли какой -нибудь способ написать эквивалент LINQ запроса HQL как работа? [/b]

Подробнее здесь: https://stackoverflow.com/questions/797 ... ing-and-us
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»