0

嗨,我需要帮助从 MYSQL 在 NHibernate 中进行 QueryOver。MYSQL 代码看起来像这样

select lietadlo.id,lietadlo.volne,spolocnost.name,typ.name,typ.miest from lietadlo
join spolocnost on spolocnost.id = lietadlo.spolocnostt_id
join typ on typ.id = lietadlo.typp_id
where spolocnost.pocetlietadiel > 2

然后我如何在数据网格视图中编写它?

编辑:所以到目前为止我已经完成了这个并尝试了它(效果很好)

ISessionFactory factory =
new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
ISession session = null;
session = factory.OpenSession();

Lietadlo f = null;
Spolocnost t = null;
Typ r = null;

dgv.DataSource = session.QueryOver<Lietadlo>(() => f)
.JoinAlias(() => f.Spolocnostt_Id,() => t)
.JoinAlias(() => f.Typp_Id, ()=> r)
.Where(() => t.Pocetlietadiel > 2)
.And(() => r.Name == "Boeing-747")
.List<Lietadlo>()
.ToList<Lietadlo>();

但仍然在 DataGridView 中,我只从 Lietadlo 获得列,我只希望从 Lietadlo 获得 id(int)、volne(int) 和 Spolocnost name(string) 以及 Typ name(string) 和 miest(int)。

4

1 回答 1

0

我希望这是一种绑定方式(仅供阅读)。在这种情况下,您可以从 Projections 中获利。在此处查看更多信息16.6。预测

您可以为您的网格创建一些 DTO 对象,类似于文档:

CatSummary summaryDto = null;
IList<CatSummary> catReport =
    session.QueryOver<Cat>()
        .SelectList(list => list
            .SelectGroup(c => c.Name).WithAlias(() => summaryDto.Name)
            .SelectAvg(c => c.Age).WithAlias(() => summaryDto.AverageAge))
        .TransformUsing(Transformers.AliasToBean<CatSummary>())
        .List<CatSummary>();

您应该可以这样做(我现在无法检查,但应该很清楚)

LietadloDTO lietadloDTO = null;
dgv.DataSource = session
  .QueryOver<Lietadlo>(() => f)
  .JoinAlias(() => f.Spolocnostt_Id,() => t)
  .JoinAlias(() => f.Typp_Id, ()=> r)
  .Where(() => t.Pocetlietadiel > 2)
  .And(() => r.Name == "Boeing-747")
  .SelectList(list => list
    .Select(f => f.Id).WithAlias(() => lietadloDTO.Id)
    .Select(t => t.Name).WithAlias(() => lietadloDTO.Name)
    ...
    )
  .TransformUsing(Transformers.AliasToBean<LietadloDTO>())
  .List<LietadloDTO>()
  .ToList<LietadloDTO>();

因此,在这种情况下,您将强制 NHibernate 创建 Projection(仅 1 个 SELECT 子句)并立即返回所有需要的数据

于 2013-05-11T17:34:00.080 回答