Nhibernate 4 API 文档
Nhibernate 4 API documentation
我找不到哪个命名空间包含方法的内容。
- 例如
NHibernate.IQueryOver
不包含 'Add' 的定义
并且没有扩展方法 'Add' 接受 . 类型的第一个参数
由于扩展方法,Visual studio 无助于获得适当的使用方法。
我怎么知道应该包括哪些方法、命名空间?
如果找不到我知道的方法,我通常会使用 ILSpy 来查看 dll。你 运行 它,删除所有 "default" 程序集,只拖放你需要的程序集(例如 nhibernate 的程序集),然后查看 -> 搜索,如果你知道类型名称,你select 在组合框中键入,如果您知道方法名称,您可以 select Member.
要为像 Employee
这样的实体创建 QueryOver
,我们只需要 ISession
,并引用实体
// using for below query
using System;
using MyProject.Entity;
using MyProject.Data; // to get session
通过上面的使用,我们可以得到这个查询
...
var session = ... // get session
Employee empl = null;
var employee = session
.QueryOver<Employee>()
.Where(x => x.ID > 1)
.SelectList(list => list
.Select(x => x.ID)
.Select(x => x.FirstName)
.Select(x => x.LastName)
)
.Skip(10)
.Take(10)
.List<Employee>();
要使用像 Restrictions 这样的助手,我们需要
using NHibernate.Criterion;
这将使我们能够访问 Restrictions
、Projections
、QueryOver.Of()
var disjunction = Restrictions.Disjunction();
var projection = Projections.Sum("Age");
var detachedQuery = QueryOver.Of<Employee>();
总结:
- 要访问助手,我们需要 NHibernate.Criterion。
- 要访问
QueryOver
API - 我们只需要 QueryOver
个实例。因为这些方法不是扩展,所以它们是它的方法...
如果我们想传递 QueryOver,我们只需要参考 Criterion:
using NHibernate.Criterion;
namespace MyNamespace
{
public static class MyExtension
{
public static QueryOver<T, U> AddPaging<T, U>(QueryOver<T, U> queryOver)
{
queryOver
.Skip(10)
.Take(10);
return queryOver;
}
}
}
如果我们想将 QueryOver 传递给另一个方法,并对其执行一些过滤,我们必须知道传递的类型。
下面的片段显示,我们有一些已知的接口 IBusinessObject
,它有 ID 和名称。这有助于为我们的通用参数 T 和 U 创建 where
条件 - 并应用一些与该接口相关的东西:
using NHibernate.Criterion;
namespace MyNamespace
{
public interface IBusinessObject
{
int ID { get; }
string Name { get; }
}
public static QueryOver<T, U> AddSomeFilter<T, U>(QueryOver<T, U> queryOver)
where T: IBusinessObject
where U: IBusinessObject
{
// here we can play with ID, and Name
// because we know that U is of a type IBusinessObject
queryOver
.Where(x => x.ID > 1)
.Where(x => x.Name == "Abc");
return queryOver;
}
}
}
这可能没问题,但可能会导致一些依赖性。这就是为什么我真的很喜欢使用 Criteria API。我们可以传递一些元数据,并创建更多动态处理器:
public static class MyExtension
{
public static ICriteria AddLike(ICriteria criteria, string property, string likeValue)
{
if (property.IsNotEmpty())
{
criteria.Add(Restrictions.Like(property, likeValue));
}
return criteria;
}
要处理注释中的方法,我们可以这样做:
public class SearchCriteria
{
public string PropertyName { get; set; }
public string LikeValue { get; set; }
}
public static class MyExtension
{
public static IQueryOver<Employee, Employee> ConstructQueryConditions(
this IQueryOver<Employee, Employee> query
, SearchCriteria criteria)
{
if (criteria.PropertyName.IsNotEmpty())
{
query.Where(Restrictions.Like(criteria.PropertyName, criteria.LikeValue));
}
return query;
}
我找不到哪个命名空间包含方法的内容。
- 例如
NHibernate.IQueryOver
不包含 'Add' 的定义 并且没有扩展方法 'Add' 接受 . 类型的第一个参数
Visual studio 无助于获得适当的使用方法。
我怎么知道应该包括哪些方法、命名空间?
如果找不到我知道的方法,我通常会使用 ILSpy 来查看 dll。你 运行 它,删除所有 "default" 程序集,只拖放你需要的程序集(例如 nhibernate 的程序集),然后查看 -> 搜索,如果你知道类型名称,你select 在组合框中键入,如果您知道方法名称,您可以 select Member.
要为像 Employee
这样的实体创建 QueryOver
,我们只需要 ISession
,并引用实体
// using for below query
using System;
using MyProject.Entity;
using MyProject.Data; // to get session
通过上面的使用,我们可以得到这个查询
...
var session = ... // get session
Employee empl = null;
var employee = session
.QueryOver<Employee>()
.Where(x => x.ID > 1)
.SelectList(list => list
.Select(x => x.ID)
.Select(x => x.FirstName)
.Select(x => x.LastName)
)
.Skip(10)
.Take(10)
.List<Employee>();
要使用像 Restrictions 这样的助手,我们需要
using NHibernate.Criterion;
这将使我们能够访问 Restrictions
、Projections
、QueryOver.Of()
var disjunction = Restrictions.Disjunction();
var projection = Projections.Sum("Age");
var detachedQuery = QueryOver.Of<Employee>();
总结:
- 要访问助手,我们需要 NHibernate.Criterion。
- 要访问
QueryOver
API - 我们只需要QueryOver
个实例。因为这些方法不是扩展,所以它们是它的方法...
如果我们想传递 QueryOver,我们只需要参考 Criterion:
using NHibernate.Criterion;
namespace MyNamespace
{
public static class MyExtension
{
public static QueryOver<T, U> AddPaging<T, U>(QueryOver<T, U> queryOver)
{
queryOver
.Skip(10)
.Take(10);
return queryOver;
}
}
}
如果我们想将 QueryOver 传递给另一个方法,并对其执行一些过滤,我们必须知道传递的类型。
下面的片段显示,我们有一些已知的接口 IBusinessObject
,它有 ID 和名称。这有助于为我们的通用参数 T 和 U 创建 where
条件 - 并应用一些与该接口相关的东西:
using NHibernate.Criterion;
namespace MyNamespace
{
public interface IBusinessObject
{
int ID { get; }
string Name { get; }
}
public static QueryOver<T, U> AddSomeFilter<T, U>(QueryOver<T, U> queryOver)
where T: IBusinessObject
where U: IBusinessObject
{
// here we can play with ID, and Name
// because we know that U is of a type IBusinessObject
queryOver
.Where(x => x.ID > 1)
.Where(x => x.Name == "Abc");
return queryOver;
}
}
}
这可能没问题,但可能会导致一些依赖性。这就是为什么我真的很喜欢使用 Criteria API。我们可以传递一些元数据,并创建更多动态处理器:
public static class MyExtension
{
public static ICriteria AddLike(ICriteria criteria, string property, string likeValue)
{
if (property.IsNotEmpty())
{
criteria.Add(Restrictions.Like(property, likeValue));
}
return criteria;
}
要处理注释中的方法,我们可以这样做:
public class SearchCriteria
{
public string PropertyName { get; set; }
public string LikeValue { get; set; }
}
public static class MyExtension
{
public static IQueryOver<Employee, Employee> ConstructQueryConditions(
this IQueryOver<Employee, Employee> query
, SearchCriteria criteria)
{
if (criteria.PropertyName.IsNotEmpty())
{
query.Where(Restrictions.Like(criteria.PropertyName, criteria.LikeValue));
}
return query;
}