我一直在寻找几个小时如何做到这一点,但似乎找不到任何帮助我.
这是数据库模型:

这是我尝试运行的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) 我有以下查询工作,它获得我想要的结果:
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?
我看过类似的问题,但找不到简单的解释.我本可以错过它,但我保证我看了.实际上我甚至找不到一篇文章,除了一篇博文文章,它快速掩盖了一切,并假设你熟悉其他形式的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方法编写查询.我能够编写和编写如下面的代码.它的工作正常.
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或两者的组合.我该如何实现呢.谢谢
我想要提出的是这样的表达方式:
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模拟主题查询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查询(类似于).然而,看着这一点,它看起来并不像我.DetachedCriteriaQueryOver.Of<T>()
使用DetachedCriteria,我会创建我的实例并设置它,但我需要,然后调用GetExecutableCriteria()然后分配会话并执行查询.使用"分离" QueryOver,大多数API都不可用(即,添加限制,连接,排序等等),直到我打电话GetExecutableQueryOver,这需要一个ISession或IStatelessSession,此时您不再断开连接.
你如何使用分离的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>.
如何使用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语言编写这个特定的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)
有人能指出我正确的方向,或解释我做错了什么?
提前致谢.
基本上我想要做的就是编写这段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中