首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Nhibernate 4 API文档

Nhibernate 4 API文档
EN

Stack Overflow用户
提问于 2015-04-19 12:12:16
回答 3查看 697关注 0票数 1

我无法找到哪个名称空间包含用于方法的内容。

  • 例如,NHibernate.IQueryOver不包含“Add”的定义,也不包含接受类型的第一个参数的扩展方法“Add”。

由于使用扩展方法,Visual无助于获得适当的使用方法。

我如何知道应该包括哪些方法、名称空间?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-19 13:21:00

如果我们希望将QueryOver传递给另一个方法,并对其执行一些筛选,则必须知道传递的类型。

下面的片段显示,我们有一些已知的接口IBusinessObject,,它具有ID和名称。这可能有助于为我们的通用params T和U创建where条件,并应用一些与该接口相关的内容:

代码语言:javascript
运行
复制
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;
        }
    }
}

这可能是好的,但它可能会导致一些依赖。这就是为什么我喜欢使用标准API的原因。我们可以传递一些元数据,并创建更多的动态处理器:

代码语言:javascript
运行
复制
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;
    }

要处理注释中的方法,我们可以这样做:

代码语言:javascript
运行
复制
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;
    }
票数 2
EN

Stack Overflow用户

发布于 2015-04-19 13:00:51

要为实体(如QueryOver )创建Employee,我们只需要ISession,并引用实体

代码语言:javascript
运行
复制
// using for below query
using System;
using MyProject.Entity;
using MyProject.Data; // to get session

有了上面的使用,我们可以有这个查询

代码语言:javascript
运行
复制
...
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>();

要使用像限制一样的帮手,我们需要

代码语言:javascript
运行
复制
using NHibernate.Criterion;

这样我们就可以访问RestrictionsProjectionsQueryOver.Of()

代码语言:javascript
运行
复制
var disjunction = Restrictions.Disjunction();
var projection = Projections.Sum("Age");
var detachedQuery = QueryOver.Of<Employee>();

摘要:

  1. 要接触帮手,我们需要NHibernate.Criterion。
  2. 要访问QueryOver API,我们只需要QueryOver实例。因为这些方法是而不是扩展,所以它们是它的方法.

如果我们想通过QueryOver,我们只需参考标准:

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-04-19 12:26:56

如果我无法找到我知道的方法,我通常做的是使用ILSpy来查看dll。运行它,删除所有“默认”程序集,只拖拽所需的资产(例如nhibernate的资产),然后查看->搜索,如果您知道在组合框中选择type的类型名称,如果您知道选择成员的方法名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29729683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档