2014-01-06 58 views
3

我有两个类映射到数据库中。这些表格与“DeptId”字段具有主键和外键关系。如何编写Nhibernate查询

Employee.cs

public class Employee: Entity 
    { 
     public virtual Int32 Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual string Gender { get; set; } 
     public virtual Int32 Age { get; set; } 
     public virtual string Designation { get; set; } 
     public virtual bool Enabled { get; set; } 
     public virtual int CreatedById { get; set; } 
     public virtual DateTime CreatedDate { get; set; } 
     public virtual int? LastModifiedById { get; set; } 
     public virtual DateTime? LastModifiedDate { get; set; } 
     public virtual bool IsDeleted { get; set; } 
     public virtual Department Department { get; set; } 
    } 

Department.cs

public class Department 
    { 
     public virtual int DeptId { get; set; } 
     public virtual string DeptName { get; set; } 
     public virtual bool Enabled { get; set; } 
    } 

由于我是新来的NHibernate,我无法编写使用QueryOver更复杂的LINQ查询。我已经写了下面的查询,但是我怎么写更先进的查询。请为我提供示例查询和参考。

var query = Session.QueryOver<Employee>().List(); 
+0

在大多数情况下,你可以使用LINQ ..你有什么尝试?你想做什么? –

+0

我想实现连接并使用NHibernate的平均总和等内置函数。 –

+1

好,如果这有帮助;)NHibernate是伟大的工具,请不要放弃! ;) –

回答

11

NHibernate查询文档非常好,完整。基本知识,你可以在这里找到:

QueryOver API,这是Criteria完整类型的版本记录在这里:

开始观察API文档。很快你会看到它是相当逻辑的(.Where()来建立WHERE,.Select()来调整SELECT ....)。后来,如有问题,SO充满HOW TO

从16.1一例调整为职工:

var list = session 
     .QueryOver<Employee>() 
     .WhereRestrictionOn(c => c.Age).IsBetween(18).And(60) 
     .Select(c => c.Name) 
     .OrderBy(c => c.Name).Asc 
     .List<string>(); 

了一个连接以部门(从16.4调整为例)

var query = session 
     .QueryOver<Employee>() 
     .JoinQueryOver(e => e.Department) 
      .Where(k => k.DeptName == "Director"); 
+0

这些章节的链接现在已经死了。 – krillgar

+1

@krillgar,非常感谢...我更新了新的NH doc站点的链接... –

1

查询的结构

使用以下语法从ISession创建查询:

IList<Department> Dept= 
session.QueryOver<Department>() 
    .Where(c => c.DeptName == "Max") 
    .List();