Документация по 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>();

Резюме:

  1. чтобы получить доступ к помощникам, нам нужен NHibernate.Criterion.
  2. Иметь доступ к 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 в поле со списком. Если вы знаете имя метода, вы выбираете Член.

Другие вопросы по тегам