【问题标题】:Nhibernate queryover (or lambda Linq) to add count of subquery in projectionNhibernate queryover(或 lambda Linq)在投影中添加子查询计数
【发布时间】:2021-10-10 11:39:15
【问题描述】:

给定这张表

TABLE A(
IdA NUMERIC PRIMARY KEY
,DescA VARCHAR2(200)
)

TABLE B(
IdB NUMERIC PRIMARY KEY
,IdA NUMERIC
,DescB VARCHAR2(200)
)

我要选择

IdA
, DescA
, Count Of B For Each A

进入自定义 DTO

使用 is dto 进行投影不是问题,但我正在寻找一种方法将计数添加到我的查询中

A AAlias = null;
            DtoType myDTO = null;

            return _session.QueryOver<A>(() => AAlias )
          .Select(Projections.Property(() => AAlias.IdA).WithAlias(() => myDTO.IdA),
                  Projections.Property(() => corsoAlias.DescA).WithAlias(() => myDTO.DescA))
            .TransformUsing(Transformers.AliasToBean<DtoType>())
            .List<DtoType>()
            .AsEnumerable();

编辑: 领域对象:

public class TableA
{
    public Guid Id { get; set; }
    public string Desc { get; set; }
    public ICollection<B> Bs { get; set; }
}

public class TableB
{
    public Guid Id { get; set; }
    public string Desc { get; set; }
}

【问题讨论】:

    标签: c# nhibernate subquery queryover nhibernate-projections


    【解决方案1】:

    正如您所说,您想为每个 TableA 计算所有 TableB。为此,您需要一个子查询。

    public class TableA
    {
        public Guid Id { get; set; }
    
        public string Desc { get; set; }
    }
    
    public class TableB
    {
        public Guid Id { get; set; }
    
        public TableA TableA { get; set; }
    
        public string Desc { get; set; }
    }
    
    public class Dto
    {
        public Guid IdA { get; set; }
    
        public string DescA { get; set; }
    
        public int CountOfBForEachA { get; set; }
    }
    
    
    public class MyDtoService : IMyDtoService
    {
        private readonly ISession _session;
    
        public MyDtoService(ISession session)
        {
            _session = session;
        }
    
        public void GetDto()
        {
            TableA tableA = null;
            TableB tableB = null;
            Dto dto = null;
    
            var countOfBForEachASubQuery = QueryOver.Of(() => tableB)
                .Where(() => tableB.TableA.Id == tableA.Id)
                .Select(x => tableB.Id);
    
            var result = _session.QueryOver(() => tableA)
                .Select(Projections.Property(() => tableA.Id),
                    Projections.Property(() => tableA.Desc).WithAlias(() => dto.DescA),
                    Projections.SubQuery(countOfBForEachASubQuery.DetachedCriteria).WithAlias(() => dto.CountOfBForEachA))
                .TransformUsing(Transformers.AliasToBean<Dto>())
                .List<Dto>();
        }
    }
    

    【讨论】:

    • 对不起,我已经习惯了,我忘了写那个模型没有导航属性:我只有 A 类中的 B 列表。我更新了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多