标签: linq-to-nhibernate

NHibernate Linq - how to create a where statement with IS NOT NULL

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)

nhibernate linq-to-nhibernate

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

Linq to NHibernate ThenFetch多个属性

我有这个对象图:

// 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)

c# fetching-strategy linq-to-nhibernate

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

使用OR-Mapper是否有意义?

使用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).

database nhibernate orm entity-framework linq-to-nhibernate

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

如何使用nhibernte linq的nhibernate ToFuture查询

ToFuture与nhibernate linq一起使用吗?如果是这样,你如何使用它?

linq-to-nhibernate nhibernate-3

7
推荐指数
2
解决办法
3494
查看次数

NHibernate使用错误的连接生成SQL

我有一个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)

c# nhibernate-mapping fluent-nhibernate linq-to-nhibernate

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

QueryOver语句,用于选择具有降序DateTime顺序的N行

我正在尝试编写QueryOver语句,以按降序时间顺序选择N行.

session.QueryOver<T>().Take(10).OrderBy(x=>x.DateInserted);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这根本不起作用.有什么方法可以解决它吗?

nhibernate linq-to-nhibernate nhibernate-criteria queryover

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

Nhibernate .Fetch调用在模拟会话上失败

我爱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实现(即列表)上调用它并且被忽略,那么我真的很希望不会出错,因此我仍然可以在单元测试中使用它。救命!

c# nhibernate unit-testing linq-to-nhibernate

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

选择n + 1问题

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

6
推荐指数
1
解决办法
1649
查看次数

将LINQ扩展到Nhibernate提供程序,结合Dynamic LINQ问题

我正在使用NHibernate 3.1.0,我试图通过使用BaseHqlGeneratorForMethod和扩展,DefaultLinqToHqlGeneratorsRegistryFabio的帖子中所解释的那样扩展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 …

.net c# linq nhibernate linq-to-nhibernate

6
推荐指数
1
解决办法
2547
查看次数

按日期获取记录,仅使用nhibernate进行日期部分比较

无论何时与这些记录相关联,我都希望从特定日期获取所有记录.到目前为止,我有这样的方法:

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的第一个方法?

c# linq nhibernate linq-to-nhibernate

6
推荐指数
1
解决办法
4167
查看次数