我有个问题.我有人和猫.每个Person都有一些Cats(Cats中有一个外键指向Persons中的主键).每只猫都有一个年龄.我想选择有"老"猫的人.我想要这些人的所有猫,而不仅仅是"老"猫.我需要使用QueryOver语法来完成它.
在T-SQL中它将是这样的:
SELECT P.*, C.*
FROM Persons P
LEFT JOIN Cats C
ON P.Id = C.OwnerId
WHERE EXISTS (
SELECT 1
FROM Cats C2
WHERE P.Id = C2.OwnerId AND C2.Age > 5)
Run Code Online (Sandbox Code Playgroud)
我知道我必须使用子查询,并且我可以轻松地使用"旧的"nhibernate语法(Criteria/DetachedCriteria),但我无法在QueryOver语法中执行此操作.
我不想要"IN"状态.我的主键是一个复杂的键,所以我无法使用IN.
var persons = session.QueryOver<Person>.WithSubquery.WhereExists( ??? );
Run Code Online (Sandbox Code Playgroud) 我想使用查询来给我一个对象
public class TaskMap : ClassMap<Task>
{
public TaskMap()
{
Table("Tasks");
Id(x => x.TaskId);
Map(x => x.TaskName).NvarcharWithMaxSize().Not.Nullable();
Map(x => x.Description).NvarcharWithMaxSize();
Map(x => x.DueDate).Not.Nullable();
HasMany(x => x.PersonalTaskReminders).Inverse();
HasMany(x => x.TaskReminders).Inverse();
References(x => x.Course).Not.Nullable();
HasMany(x => x.CompletedTasks);
}
}
[Serializable()]
public class Task
{
public virtual int TaskId { get; private set; }
public virtual string TaskName { get; set; }
public virtual string Description { get; set; }
public virtual DateTime DueDate { get; set; }
public virtual IList<PersonalTaskReminder> PersonalTaskReminders { …Run Code Online (Sandbox Code Playgroud) 我有一个简单的QueryOver
var q = SessionInstance.QueryOver<Person>().Where(p => p.Number.Equals(number));
Run Code Online (Sandbox Code Playgroud)
数字字段类型为int.此消息的此查询有运行时错误:
无法识别的方法调用:System.Int32:Boolean Equals(Int32)
我一直在努力解决这个问题,所以我希望你们中的一些QueryOver专家可以提供帮助.
我有一个博客帖子列表.您可以在每篇博文上投票,我希望(除其他外)收到用户尚未投票的帖子列表.
首先我想做的事情如下:
Session.QueryOver<BlogPost>()
.WhereRestrictionOn(bp => bp.Id)
.NotIn(existingBlogPostVotes);
Run Code Online (Sandbox Code Playgroud)
(existingBlogPostVoteIds是投票博客帖子的ID)
但是在QueryOver框架中不存在这种情况.
我发现我可以在Criteria中这样做:
var crit =
Session.CreateCriteria<BlogPost>()
.Add(Restrictions.Not(Restrictions.In("Id",existingBlogPostVotes)));
Run Code Online (Sandbox Code Playgroud)
但我想在QueryOver而不是Criteria中这样做.
如何在QueryOver中完成?
我有一个具有引用其他实体的属性的实体(示例中为ReferenceEntity).
使用HQL,我可以这样做:
select e.ReferenceEntity from Entity e where e.Id = :entityId
Run Code Online (Sandbox Code Playgroud)
NHibernate会给我一个没有懒惰的ReferenceEntity实例.
通过im尝试查询执行此操作:
Session.QueryOver<Entity>()
.Where(e => e.Id == entityId)
.Select(e => e.ReferenceEntity)
.SingleOrDefault<ReferenceEntity>()
Run Code Online (Sandbox Code Playgroud)
使用QueryOver Nhibernate给了我ReferenceEntity但是懒惰.
我想通过查询来获得ReferenceEntity和eager加载,就像我使用hql一样.
谢谢
我在层次结构中有以下对象A > B > C > D.每个对象都映射到一个表.我正在尝试使用QueryOver编写以下SQL:
SELECT B
FROM A, B, C, D
WHERE A.ID = B.ID
AND B.ID = C.ID
AND C.ID = D.ID
WHERE A.NUMBER = 'VALUE'
AND D.NAME IN ('VALUE1', 'VALUE2')
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有C#代码:
string[] entityNames = entityAttributes.Select(e => e.Name).ToArray();
string customerNumber = 2;
return session.QueryOver<B>()
.JoinQueryOver(b => b.C)
.JoinQueryOver(c => c.D)
.WhereRestrictionOn(d => d.Name).IsIn(entityNames)
.List<B>();
Run Code Online (Sandbox Code Playgroud)
这里缺少的是A > B链接.我无法弄清楚如何添加连接以A限制它在NUMBER字段上.我尝试了以下但是.JoinQueryOver(b => b.C)正在寻找类型A而不是寻找类型B.
return session.QueryOver<B>()
.JoinQueryOver(b …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用QueryOver在nHibernate中构建一个简单的查询,但我希望它将所有内容转换为小写或忽略敏感:
Domain.User User = Session.QueryOver<Domain.User>()
.Where(x=>x.Login=="username")
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
更新:
有人建议问题可能在于DB的收集,但我从来没有遇到任何问题,这个脚本有效:
Domain.User User = Session
.CreateCriteria<Domain.User>()
.Add(Expression.Eq("Login", "username"))
.UniqueResult<Domain.User>();
Run Code Online (Sandbox Code Playgroud) 我一直在寻找几个小时如何做到这一点,但似乎找不到任何帮助我.
这是数据库模型:

这是我尝试运行的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) 测试时,以下行以空引用失败:
var awards = _session.QueryOver<Body>().Where(x => x.BusinessId == (int)business).List();
Run Code Online (Sandbox Code Playgroud)
我的测试是这样的:
var mockQueryOver = new Mock<IQueryOver<Body, Body>>();
mockQueryOver.Setup(q => q.List()).Returns(new List<Body> {_awardingBody});
_mockSession.Setup(c => c.QueryOver<Body>()).Returns((mockQueryOver.Object));
_mockCommandRunner = new Mock<ICommandRunner>();
_generator = new CertificateGeneratorForOpenSSLCommandLine(_mockSession.Object, _mockCommandRunner.Object, _mockDirectory.Object, _mockFile.Object, _mockConfig.Object);
Run Code Online (Sandbox Code Playgroud)
说实话,我在黑暗中徘徊 - 我对nHibernate和Moq相对较新,所以我不太确定要google什么才能获得正确的信息.
我只是发布代码:
public IList<Dish> GetByNameDishTypes(IEnumerable<string> names,
IEnumerable<string> dishTypes)
{
// return dishes (ie food) whose name is in the names enumerable,
// or whose type is in the dish types enumerables
// (this would be 'breakfast', 'dinner') ..
var namesArr = names != null ? names.ToArray() : new string[0];
var dishTypesArr = dishTypes != null ? dishTypes.ToArray() : new string[0];
var criteria = this.Session.CreateCriteria<Dish>();
criteria.CreateAlias("DishType", "dt");
criteria.Add(
Restrictions.Or
(
Restrictions.In("Name", namesArr),
Restrictions.In("dt.Name", dishTypesArr)
));
return criteria.List<Dish>();
/* get this to work? …Run Code Online (Sandbox Code Playgroud) nhibernate ×10
queryover ×10
c# ×5
alias ×1
join ×1
lazy-loading ×1
moq ×1
select ×1
subquery ×1
unit-testing ×1