假设以下情形:
class Project{
public Job Job;
}
class Job{
public Name;
}
Run Code Online (Sandbox Code Playgroud)
假设我想使用Criteria API来搜索Job的名称为"sumthing"的所有项目.
我可以使用CreateAlias为Job创建别名并使用它来访问Name,或者我可以为属性Job创建一个新Criteria并按Name搜索.
表现明智,有什么区别吗?
我有一个遗留数据库,我使用NHibernate进行映射.关注的对象是帐户和通知对象列表.对象看起来像:
public class Notification
{
public virtual int Id { get; set; }
public virtual DateTime BatchDate { get; set; }
/* other properties */
public virtual Account Account { get; set; }
}
public class Account
{
public virtual int Id { get; set; }
public virtual string AccountNumber { get; set; }
/* other properties */
}
Run Code Online (Sandbox Code Playgroud)
映射文件如下所示:
<class name="Account" table="Account" dynamic-update="true">
<id name="Id" column="AccountID">
<generator class="native" />
</id>
<property name="AccountNumber" length="15" not-null="true" />
<!-- other properties --> …
Run Code Online (Sandbox Code Playgroud) hql和criteriaApi和QueryOver之间的性能差异是什么?是否存在一个比另一个更快或更慢的情况?
编辑:我用QueryOver和Linq扩展了问题.
=============================================
好吧,我不确定哪个回复标记为答案所以我将标记最多VoteUp的帖子.我不知道.这实际上是一个问题,而不是一个问题.
如何使用NHibernate Criteria API获取"top n"?理想情况下,我想使用分离标准.
我试图使用NHibernate查询我的一个域类上的IList <string>属性.这是一个简单的例子来演示:
public class Demo
{
public Demo()
{
this.Tags = new List<string>();
}
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<string> Tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
映射如下:
<class name="Demo">
<id name="Id" />
<property name="Name" />
<bag name="Tags">
<key column="DemoId"/>
<element column="Tag" type="String" />
</bag>
Run Code Online (Sandbox Code Playgroud)
我能够保存和检索就好了.现在查询我的域类的实例,其中Tags属性包含指定的值:
var demos = this.session.CreateCriteria<Demo>()
.CreateAlias("Tags", "t")
.Add(Restrictions.Eq("t", "a"))
.List<Demo>();
Run Code Online (Sandbox Code Playgroud)
导致错误:收集不是关联:Demo.Tags
var demos = (from d in this.session.Linq<Demo>()
where d.Tags.Contains("a")
select d).ToList();
Run Code Online (Sandbox Code Playgroud)
导致错误:Objct引用未设置为对象的实例. …
我可以使用Criteria执行t-sql命令来选择表中列的最大值吗?
'从客户中选择@cus_id = max(id)+ 1'
钽
奥利
这些类有一些类似的方法,但似乎工作略有不同.
它们之间的区别是什么?我应该何时使用它们?
我想创建一个超过3-4 Expression.Or的查询?但Expression.Or只是让我在其中添加两个表达式.
if (!string.IsNullOrEmpty(keyword))
query
.Add(Expression.Or(
Expression.Like("Name", keyword, MatchMode.Anywhere),
Expression.Like("LastName", keyword, MatchMode.Anywhere)))
.Add(Expression.Or(
Expression.Like("Email1", keyword, MatchMode.Anywhere),
Expression.Like("Email2", keyword, MatchMode.Anywhere)));
Run Code Online (Sandbox Code Playgroud)
上面的代码生成"名称像%this this或LastName like%this%AND Email1 like%this%和Email2 like%this.
提前致谢.
我已经开始接触NHibernate了.我正在尝试执行一个查询,从表中选择所有记录,但有一个排除过滤器ID列表,例如.给我所有产品,除了这些具有这些ID值的产品.
通常在直接T-SQL中,我会将要排除的ID传递给NOT IN子句,就像这样.
SELECT *
FROM Products
WHERE ProductId NOT IN (1,5,9,23,45)
Run Code Online (Sandbox Code Playgroud)
我如何使用ICriteria或HQL(但最好是ICriteria)在NHibernate中执行此操作?
我正在使用NHibernate,并试图找出如何编写查询,搜索我的实体的所有名称,并列出结果.举个简单的例子,我有以下几个对象;
public class Cat {
public string name {get; set;}
}
public class Dog {
public string name {get; set;}
}
public class Owner {
public string firstname {get; set;}
public string lastname {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
事实上,我想创建一个查询,比如说,并且返回所有宠物主人,其名称包含"ted",OR宠物的名称包含"ted".
这是我想要执行的SQL的示例:
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
OR c.name like '%ted%'
OR d.name …
Run Code Online (Sandbox Code Playgroud) icriteria ×10
nhibernate ×10
criteria ×4
c# ×2
hql ×2
performance ×2
expression ×1
lazy-loading ×1
linq ×1
sql ×1
t-sql ×1