标签: queryover

nhibernate queryover与子查询连接以获取聚合列

我一直在寻找几个小时如何做到这一点,但似乎找不到任何帮助我.

这是数据库模型:

在此输入图像描述

这是我尝试运行的SQL查询:

SELECT b.*, a.Assignments FROM Branch b LEFT JOIN (
        SELECT b.BranchID , COUNT(ab.BranchID) AS Assignments
        FROM Branch b LEFT JOIN AssignmentBranch ab ON b.BranchID = ab.BranchID
        GROUP BY b.BranchID
      ) a ON b.BranchID = a.BranchID
Run Code Online (Sandbox Code Playgroud)

所以,基本上,我想返回一个分支列表和一个新列,表示该分支的赋值数.

分支模型

public class Branch : IEntity<int>
{
    public virtual int ID
    {
        get;
        set;
    }

    public virtual string Name { get; set; }

    public virtual IList<AssignmentBranch> Assignments { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

AssignmentBranch模型

public class AssignmentBranch : IEntity<int>
{
    public virtual …
Run Code Online (Sandbox Code Playgroud)

nhibernate subquery queryover

10
推荐指数
1
解决办法
1万
查看次数

NHibernate QueryOver加入不相关的实体

我有以下查询工作,它获得我想要的结果:

int associatedId = 123;

MyObject alias = null;

var subQuery = QueryOver.Of<DatabaseView>()
    .Where(view => view.AssociatedId == associatedId)
    .And(view => view.ObjectId == alias.ObjectId)
    .Select(view => view.ObjectId);

var results = session.QueryOver<MyObject>(() => alias)
    .WithSubquery.WhereExists(subQuery)
    .List();
Run Code Online (Sandbox Code Playgroud)

DatabaseView已被映射为实际的NHibernate实体(因此我可以将它与QueryOver一起使用),但它与HBM映射中的MyObject无关.

此查询使用SELECT ... FROM MyObject WHERE EXISTS(此处为DatabaseView的子查询)返回IList.如何重新编写此信息以返回相同的信息,而不是使用JOIN?

nhibernate queryover

9
推荐指数
2
解决办法
8222
查看次数

NHibernate QueryOver子查询

我看过类似的问题,但找不到简单的解释.我本可以错过它,但我保证我看了.实际上我甚至找不到一篇文章,除了一篇博文文章,它快速掩盖了一切,并假设你熟悉其他形式的NH.

鉴于之间的多对多,Program并且Topic后者处于层次结构中Topics,我想要检索Programs给定的所有内容Topic,可能包括其子主题.由于程序可能列在给定父主题的多个子主题下,我需要使用子查询或处理必须使用distinct(并且简单的方法TransformUsing(Transformers.DistinctRootEntity)不起作用).

原始SQL应该是这样的

SELECT ProgramId, Title, bar, baz, foo FROM Programs 
WHERE ProgramId IN 
 (SELECT ProgramId from Program_Topics WHERE TopicId IN (1, 2, ...))
Run Code Online (Sandbox Code Playgroud)

结果将转换为模型类型以传输到视图.我最初的尝试是这样的:

ProgramDTO pDTO = null;

/* topicIds is List<int> passed into function */

var query = Session.QueryOver<Program>()
.JoinQueryOver<Topic>(p => p.Topics)
.WhereRestrictionOn(pt => pt.Id).IsInG<int>(topicIds)     
.TransformUsing(Transformers.DistinctRootEntity)
.SelectList(list => list
        .Select(program => program.Id).WithAlias(() => pDTO.Id)
        .Select(program => program.Title).WithAlias(() => pDTO.Title)
        .Select(program => program.Location).WithAlias(() => pDTO.Location)
        .Select(program => …
Run Code Online (Sandbox Code Playgroud)

nhibernate queryover

9
推荐指数
2
解决办法
2万
查看次数

在NHibernate的queryover中使用OR Clause

我正在使用Nhibernate.我正在通过queryover方法编写查询.我能够编写和编写如下面的代码.它的工作正常.

db.QueryOver(Of Users)()
  .Where(Function(x) x.Role = "Guest")
  .And(Function(x) x.Block = 0)
  .And(Function(x) x.APPID = appId)
  .List();
Run Code Online (Sandbox Code Playgroud)

但我想使用Or子句代替And或两者的组合.我该如何实现呢.谢谢

c# sql nhibernate queryover

9
推荐指数
1
解决办法
8460
查看次数

NHibernate QueryOver按第一个非空值排序(合并)

我想要提出的是这样的表达方式:

var result = Session.QueryOver<Foo>().OrderBy(f => f.UpdatedAt ?? f.CreatedAt);
Run Code Online (Sandbox Code Playgroud)

果然,这不起作用.在T-SQL中粗略相当于此

... order by coalesce(f.UpdatedAt, f.CreatedAt)
Run Code Online (Sandbox Code Playgroud)

在NHibernate QueryOver中进行"合并"的犹太方法是什么?

nhibernate coalesce queryover

8
推荐指数
1
解决办法
2202
查看次数

哪里......在......或者哪里......在...中使用NHibernate IQueryOver

我正试图用NHibernate模拟主题查询IQueryOver.到目前为止我有

var q = CurrentSession.QueryOver<ObjectModel.Order>().
    WhereRestrictionOn(o => o.Buyer.ID).IsIn(partyIDs).
    WhereRestrictionOn(o => o.Seller.ID).IsIn(partyIDs);
Run Code Online (Sandbox Code Playgroud)

但是,这会生成一个and查询,而我需要or在两个where子句之间有一个运算符.

这是怎么做到的IQueryOver

nhibernate queryover

8
推荐指数
1
解决办法
7228
查看次数

你如何使用分离的QueryOver实例?

这篇NHibernate博客文章指出了如何创建(使用)分离的QueryOver查询(类似于).然而,看着这一点,它看起来并不像我.DetachedCriteriaQueryOver.Of<T>()

使用DetachedCriteria,我会创建我的实例并设置它,但我需要,然后调用GetExecutableCriteria()然后分配会话并执行查询.使用"分离" QueryOver,大多数API都不可用(即,添加限制,连接,排序等等),直到我打电话GetExecutableQueryOver,这需要一个ISessionIStatelessSession,此时您不再断开连接.

你如何使用分离的QueryOver实例?

编辑:

实际问题与我如何存储分离的QueryOver实例有关:

public class CriteriaQuery<T>
{
    internal protected QueryOver<T> _QueryOver { get; set; }

    public CriteriaQuery()
    {
        _QueryOver = QueryOver.Of<T>();
    }

    // Snip
}
Run Code Online (Sandbox Code Playgroud)

它应该是一个QueryOver<T, T>.

nhibernate queryover

8
推荐指数
1
解决办法
4126
查看次数

QueryOver API OrderBy使用Case

如何使用QueryOver API执行以下LINQ to NHibernate查询.这将从DB获取Item的所有记录的列表,并将状态为"Returned"的Items放置到列表的末尾.状态是Enum,它映射到数据库中的nvarchar.

var workList = session.Query<Item>()
                .OrderBy(i=> i.Status == Status.Returned ? 1 : 0)
                .ToList();
Run Code Online (Sandbox Code Playgroud)

SQL等价物是

SELECT *
FROM Item
ORDER BY case when Status='Returned' then 1 else 0 end
Run Code Online (Sandbox Code Playgroud)

我当然试过了

var workList = session.QueryOver<Item>()
                .OrderBy(i => i.Status == Status.Returned ? 1 : 0).Asc
                .ToList();
Run Code Online (Sandbox Code Playgroud)

但我得到以下内容

InvalidOperationException:从范围''引用的'MyProject.Model.Entities.Item'类型的变量'i',但它未定义

我不能使用LINQ,因为在这种情况下有一些其他功能的问题.

nhibernate queryover

8
推荐指数
1
解决办法
1916
查看次数

nHibernate QueryOver中的GROUP BY和HAVING子句

我正在尝试用nHibernate QueryOver语言编写这个特定的sql查询,我不是很熟悉:

SELECT MessageThreadId FROM MessageThreadAccesses
WHERE ProfileId IN (arr)
GROUP BY MessageThreadId
HAVING COUNT(MessageThreadId) = arr.Count
Run Code Online (Sandbox Code Playgroud)

其中arr是一个整数数组(用户ID)我作为参数传递,而MessageThreadAccess实体如下所示:

public virtual MessageThread MessageThread { get; set; }
public virtual Profile Profile { get; set; }
....
Run Code Online (Sandbox Code Playgroud)

在阅读了多个堆栈溢出线程并进行实验后,我得到了我的查询(尝试获取MessageThread对象 - 它应该总是只有一个或没有),但它仍然不起作用,我不确定还有什么可以尝试.查询似乎总是返回MessageThreadAccess对象,但是当读取它的MessageThread属性时,它总是为NULL.

var access = Session.QueryOver<MessageThreadAccess>()
    .WhereRestrictionOn(x => x.Profile).IsIn(participants.ToArray())
    .Select(Projections.ProjectionList()
        .Add(Projections.Group<MessageThreadAccess>(x => x.MessageThread))
    )
    .Where(
        Restrictions.Eq(Projections.Count<MessageThreadAccess>(x => x.MessageThread.Id), participants.Count)
    )
    .TransformUsing(Transformers.AliasToBean<MessageThreadAccess>())
    .SingleOrDefault();

return Session.QueryOver<MessageThread>()
    .Where(x => x.Id == access.MessageThread.Id)
    .SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

有人能指出我正确的方向,或解释我做错了什么?

提前致谢.

c# nhibernate queryover

8
推荐指数
1
解决办法
7824
查看次数

流利的nHibernate QueryOver SQL'CASE'等效

基本上我想要做的就是编写这段SQL:

SELECT
CASE
    WHEN t.type = 'a' THEN
        t.name
    ELSE
        t.otherName
    END
    as "Name"
FROM myTable t
Run Code Online (Sandbox Code Playgroud)

在QueryOver中

sql case fluent-nhibernate queryover

7
推荐指数
1
解决办法
3483
查看次数

标签 统计

queryover ×10

nhibernate ×9

c# ×2

sql ×2

case ×1

coalesce ×1

fluent-nhibernate ×1

subquery ×1