how can i achieve this query with Nhibernate Linq?
var l = session.CreateQuery("from Auswahl a where a.Returnkey is not null").List<Auswahl>();
Run Code Online (Sandbox Code Playgroud)
i tried this but it always returns an empty list.
var l = session.Linq<Auswahl>()
.Where(item => !String.IsNullOrEmpty(item.Returnkey))
.Select(item => item)
.ToList();
Run Code Online (Sandbox Code Playgroud) 我有这个对象图:
// Lots of stuff omitted for brevity; these are all virtual properties and there
// are other properties which aren't shown on all classes.
class A {
B b;
C c;
DateTime timestamp;
}
class B {
X x;
Y y;
}
class X {
int id;
}
class C { }
class Y { }
or to put it more simply,
a = {
b: {
x { id: int },
y: { }
},
c: { }, …Run Code Online (Sandbox Code Playgroud) 使用OR映射器是否有意义?
我把这个问题放在堆栈溢出处,因为这是我所知道的最好的地方,可以找到愿意提供帮助和意见的智能开发人员.
我的推理如下:
1.)SQL在哪里?
a.)在我参与的每个专业项目中,数据的安全性是关键要求.存储过程为控制访问和审计提供了一个自然的网关.
b.)生产中的应用程序问题通常可以在表和存储过程之间解决,而无需推出新的构建.
2.)如何控制生成的SQL?我信任解析树以生成有效的SQL.我在SQL-Server和Oracle中优化SQL方面有相当多的经验,但如果我再也不必这样做,就不会感到受骗.:)
3.)如果我从存储过程中获取数据,使用OR-Mapper有什么意义?
我已将存储库模式与本地通用数据访问层一起使用.如果需要缓存集合,我会缓存它.我也有在小型CRUD应用程序上使用EF的经验,并且有助于调整遇到性能问题的NHibernate应用程序.所以我有点偏颇,但愿意学习.
在过去的几年里,我们都听到很多受人尊敬的开发人员提倡使用特定的OR-Mappers(实体框架,NHibernate等......).
任何人都可以告诉我为什么有人应该转向ORM主流项目的主流开发?
编辑:http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html似乎对这个话题进行了强有力的讨论,但它已经出来了约会
另一个编辑:每个人似乎都同意存储过程将用于重型企业应用程序,因为它们具有性能优势,并且能够将编程逻辑添加到数据附近.
我看到支持OR映射器的最有力论据是开发人员的工作效率.
我怀疑ORM运动的一个重要推动因素是开发人员对剩余持久性不可知的偏好(不关心数据是在内存中[除非缓存]还是在数据库上).
ORM似乎是本地和小型Web应用程序的优秀节省时间.
也许我所看到的最好的建议来自client09:使用ORM设置,但使用存储过程来处理数据库密集型的东西(当ORM看起来不够时,使用AKA).
ToFuture与nhibernate linq一起使用吗?如果是这样,你如何使用它?
我有一个NHibernate Linq查询,它没有按我的预期工作.
问题似乎来自于在where子句中使用左连接表中的可空int列.这导致连接充当内连接.
var list = this.WorkflowDiaryManager.WorkflowActionRepository.All
.Fetch(x => x.CaseView)
.Fetch(x => x.WorkflowActionType)
.ThenFetchMany(x => x.WorkflowActionPriorityList)
.Where(x => x.AssignedUser.Id == userId || x.CaseView.MooseUserId == userId)
Run Code Online (Sandbox Code Playgroud)
由此产生的SQL看起来像(从加入开始 - 您不需要查看所有选择)
from Kctc.WorkflowAction workflowac0_
left outer join Kctc.WorkflowCaseView workflowca1_ on workflowac0_.CaseId=workflowca1_.CaseId
left outer join Kctc.WorkflowActionType workflowac2_ on workflowac0_.WorkflowActionTypeId=workflowac2_.WorkflowActionTypeId
left outer join Kctc.WorkflowActionPriority workflowac3_ on workflowac2_.WorkflowActionTypeId=workflowac3_.WorkflowActionTypeId
,Kctc.WorkflowCaseView workflowca4_
where workflowac0_.CaseId=workflowca4_.CaseId
and (workflowac0_.AssignedUser=@p0 or workflowca4_.[MooseUserId]=@p1);
@p0 = 1087 [Type: Int32 (0)],
@p1 = 1087 [Type: Int32 (0)]
Run Code Online (Sandbox Code Playgroud)
因此导致问题的部分是上面代码段的第5行.正如您所看到的,NHibernate正在尝试在WorkflowCaseView View上进行"老派"连接.这会导致查询排除WorkflowAction表中没有CaseId的其他有效操作.
任何人都可以解释为什么NHibernate正在编写这个SQL,以及我如何鼓励它产生更好的查询?
谢谢!
WorkflowActionMap中的重要位
Table("Kctc.WorkflowAction");
Id(x => …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写QueryOver语句,以按降序时间顺序选择N行.
session.QueryOver<T>().Take(10).OrderBy(x=>x.DateInserted);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这根本不起作用.有什么方法可以解决它吗?
我爱NHibernate(和NHibernate.Linq)。我没有过早地进行优化,但是有时我会遇到一个非常讨厌的N + 1问题。对于N + 1的推荐解决Fetch方法是使用NH的扩展方法。
当我创建Mock of the时,就会出现问题ISession。我将创建一个List<User>,并将我的模拟程序设置为在有人致电时返回列表_session.Query<User>()。当我Fetch向查询添加呼叫时(即_session.Query<User>().Fetch(u => u.Address),我收到以下错误消息:
There is no method 'Fetch' on type 'NHibernate.Linq.EagerFetchingExtensionMethods'
that matches the specified arguments
Run Code Online (Sandbox Code Playgroud)
NHibernate的提取接受一个普通的旧版本,IQueryable<T>但是尝试将其强制转换为特定的NH实现,如果不能,则失败。
Fetch如果在非NH实现(即列表)上调用它并且被忽略,那么我真的很希望不会出错,因此我仍然可以在单元测试中使用它。救命!
Foo有头衔.
酒吧参考Foo.我有一个酒吧收藏.
我需要一个Foo.Title的集合.
如果我收集10个酒吧,我会称db 10次.
bars.Select(X => x.Foo.Title)
目前这个(使用NHibernate Linq并且我不想丢弃它)检索Bar集合.
var q = from b in Session.Linq<Bar>()
where ...
select b;
Run Code Online (Sandbox Code Playgroud)
我读了艾恩德对此的看法.
另一个相关问题.
一些文档.
和另一篇相关的博文.
也许这有用吗?
什么这个?
也许MultiQuery是我需要的?:/
但我仍然无法在适当的解决方案中"编译"这个.
如何避免选择n + 1?
nhibernate domain-driven-design fluent-nhibernate linq-to-nhibernate select-n-plus-1
我正在使用NHibernate 3.1.0,我试图通过使用BaseHqlGeneratorForMethod和扩展,DefaultLinqToHqlGeneratorsRegistry如Fabio的帖子中所解释的那样扩展LINQ提供程序.
例如,为了支持ToString()我创建了ToStringGenerator如下所示.
internal class ToStringGenerator : BaseHqlGeneratorForMethod
{
public ToStringGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<object>(x => x.ToString())
};
}
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Cast(visitor.Visit(targetObject).AsExpression(), typeof(string));
}
}
Run Code Online (Sandbox Code Playgroud)
我已经注册使用
internal class CustomLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public CustomLinqToHqlGeneratorsRegistry()
{
this.Merge(new ToStringGenerator());
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止这适用于"静态"查询,我可以像这样使用它:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where(p => p.Id.ToString().Contains(pId));
Run Code Online (Sandbox Code Playgroud)
这正确转换为SQL对应(使用SQL Server …
无论何时与这些记录相关联,我都希望从特定日期获取所有记录.到目前为止,我有这样的方法:
public IQueryable<Record> QueryByDay(DateTime day)
{
DateTime from = day.Date;
DateTime to = day.Date.AddDays(1);
return repository.Table
.Where(t => t.MyDate >= from && t.MyDate < to);
}
Run Code Online (Sandbox Code Playgroud)
但是在linq-to-object中我们可以做(假设Table现在是一些集合):
public IEnumerable<Record> QueryByDay(DateTime day)
{
return repository.Table
.Where(t => t.MyDate.Date == day.Date);
}
Run Code Online (Sandbox Code Playgroud)
这显然更具可读性,感觉更干净.我想知道是否有更好的方法来编写使用数据库存储和nhibernate的第一个方法?
nhibernate ×7
c# ×5
linq ×2
.net ×1
database ×1
nhibernate-3 ×1
orm ×1
queryover ×1
unit-testing ×1