Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate-使用ICriteria连接子查询_C#_Sql_Nhibernate_Subquery_Icriteria - Fatal编程技术网

C# NHibernate-使用ICriteria连接子查询

C# NHibernate-使用ICriteria连接子查询,c#,sql,nhibernate,subquery,icriteria,C#,Sql,Nhibernate,Subquery,Icriteria,我有一个SQL查询,需要使用NHibernate的ICriteriaAPI来表示 SELECT u.Id as Id, u.Login as Login, u.FirstName as FirstName, u.LastName as LastName, gm.UserGroupId_FK as UserGroupId, inner.Data1, inner.Data2, inner.Data3 FROM dbo.Us

我有一个SQL查询,需要使用NHibernate的ICriteriaAPI来表示

   SELECT u.Id as Id, 
    u.Login as Login, 
    u.FirstName as FirstName, 
    u.LastName as LastName, 
    gm.UserGroupId_FK as UserGroupId,
    inner.Data1,
    inner.Data2,
    inner.Data3
    FROM dbo.User u inner join 
    dbo.GroupMember gm on u.Id = gm.UserAnchorId_FK 
    left join
    (
        SELECT
        di.UserAnchorId_FK,
        sum(di.Data1) as Data1, 
        sum(di.Data2) as Data2, 
        sum(di.Data3) as Data3
        FROM
        dbo.DailyInfo di 
        WHERE di.Date between '2009-04-01' and '2009-06-01' 
        GROUP BY di.UserAnchorId_FK
    ) inner ON inner.UserAnchorId_FK = u.Id
    WHERE gm.UserGroupId_FK = 195 
迄今为止的尝试包括映射“User”和“DailyInfo”类(我的实体)以及将DailyInfo对象作为User对象的属性。然而,如何映射它们之间的外键关系仍然是一个谜

<one-to-one></one-to-one>

<one-to-many></one-to-many>

<generator class="foreign"><param name="property">Id</param></generator> (!) 

Id(!)
web上的解决方案通常与WHERE子句中的子查询有关,但是我需要在该子查询上保留join,以确保为未联接的行返回空值


我觉得我应该为外部查询使用一个条件,然后用一个DetachedCriteria形成一个“连接”来表示子查询?

至于映射关系,听起来用户和DailyInfo之间有一对多的关系:

<!-- User mapping -->
<bag name="DailyInfos" inverse="true">
    <key column="UserAnchorId_FK" />
    <one-to-many class="Namespace.To.DailyInfo, Namespace" />
</bag>

<!-- DailyInfo mapping -->
<many-to-one name="User" column="UserAnchorId_FK" />


至于其他的,我现在还不能完全确定。。。听起来您可能通过
GroupMember
表在
User
Group
之间有一个多对多,这可能是一个复杂的因素。请记住,您可以对条件执行
.CreateCriteria(“关联路径”,jointype)
,以创建具有指定联接类型的子条件。发布类/表关系的摘要可能会有所帮助。

我遇到了同样的问题,但没有得到任何解决方案。因此我对拦截器进行了一次黑客攻击

由条件生成的查询

SELECT u.Id as Id, 
u.Login as Login, 
u.FirstName as FirstName, 
u.LastName as LastName, 
gm.UserGroupId_FK as UserGroupId,
inner.Data1,
inner.Data2,
inner.Data3
FROM dbo.User u inner join 
dbo.GroupMember gm on u.Id = gm.UserAnchorId_FK 
InnerJoin inner ON inner.UserAnchorId_FK = u.Id
WHERE gm.UserGroupId_FK = 195
这里InnerJoin是一个与用户有1-1关系的虚拟表。 InnerJoin中的列是内部联接子查询的返回值

用户和InnerJoin的条件

DetachedCriteria forUser = DetachedCriteria.For<User>();
forUser.CreateCriteria("InnerJoin");
对于包括联接子查询在内的多个表的返回值,您必须使用NHibernate DTO 会议是这样的

CustomInterceptor custonInterceptor=new CustomInterceptor(); 

sessionFactory.OpenSession(custonInterceptor);
最后的查询将与您想要得到的结果完全相同

CustomInterceptor custonInterceptor=new CustomInterceptor(); 

sessionFactory.OpenSession(custonInterceptor);