Документация по API Nhibernate 4
Я не могу найти, какое пространство имен содержит что за методы.
- например
NHibernate.IQueryOver
не содержит определения для "Add" и метода расширения "Add", принимающего первый аргумент типа.
Visual studio не помогает получить подходящий метод использования из-за метода расширения.
Как я могу узнать, какие методы, пространства имен должны быть включены?
3 ответа
В случае, если мы хотим передать QueryOver в другой метод и выполнить некоторую фильтрацию по нему, мы ДОЛЖНЫ знать тип, который передается.
Ниже фрагмент показывает, что у нас есть некоторый известный интерфейс IBusinessObject
, который имеет идентификатор и имя. Это может помочь использовать для создания where
условия для наших общих параметров T и U - и применить некоторые вещи, связанные с этим интерфейсом:
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;
}
Создавать QueryOver
для сущности, как Employee
нам понадобится только 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, нам просто нужно сослаться на критерий:
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;
}
}
}
Если я не могу найти метод, который я знаю где-то, то я обычно использую ILSpy, чтобы взглянуть на DLL. Вы запускаете его, удаляете все сборки по умолчанию, перетаскиваете только те сборки, которые вам нужны (например, nhibernate), затем View->Search, и если вы знаете имя типа, вы выбираете Type в поле со списком. Если вы знаете имя метода, вы выбираете Член.