相关疑难解决方法(0)

使用NHibernate 3.0 QueryOver或LINQ提供程序进行权衡

与使用QueryOver语法相比,我没有找到与NHibernate 3.0 LINQ Provider支持的内容的明确比较.从表面上看,似乎有两个很大的努力分为两个非常相似的东西.

使用每种产品有哪些关键的权衡取舍?

linq nhibernate

44
推荐指数
3
解决办法
7771
查看次数

NHibernate Query <>与QueryOver <>有什么区别?

我刚开始使用NHibernate(使用SQLite)在我当前的项目中,我主要使用Query<>,因为我很熟悉在Linq中编写数据库查询.

当我遇到一些更复杂的查询时,我做了一些研究,QueryOver<>并认为它应该受到青睐,Query<>因为"QueryOver语法是NH特定的".而且,似乎没有任何东西Query<>可以做到QueryOver<>无法实现.

所以我开始相应地更换所有用法Query<>.不久之后,我有了第一个"问题",使用起来Query<>似乎更方便.示例(从CustomNumber表中的列中选择最高值BillingDataEntity):

int result = Session.Query<BillingDataEntity>().Select(x => x.CustomNumber).OrderByDescending(a => a).FirstOrDefault();
int result = Session.QueryOver<BillingDataEntity>().Select(x => x.CustomNumber).OrderBy(a => a.CustomNumber).Desc.Take(1).SingleOrDefault<int>();
Run Code Online (Sandbox Code Playgroud)

我不喜欢的是需要将结果显式地转换为int,并且Query <>版本更容易阅读.我的查询完全错了,换句话说:有更好的方法吗?

我看了一下生成的SQL输出:

NHibernate: select billingdat0_.CustomNumber as col_0_0_ from "BillingDataEntity" billingdat0_ order by billingdat0_.CustomNumber desc limit 1
NHibernate: SELECT this_.CustomNumber as y0_ FROM "BillingDataEntity" this_ ORDER BY this_.CustomNumber desc limit @p0;@p0 = 1 [Type: Int32 (0)]
Run Code Online (Sandbox Code Playgroud)

我究竟在看什么?这是NHibernate进一步转换为实际数据库查询的"内部"(依赖于方法)查询吗?

c# nhibernate

29
推荐指数
1
解决办法
3万
查看次数

LINQ Fluent NHIBERNATE .Contains()在QueryOver <>中不起作用,但在Query <>中起作用

使用FNH,我尝试使用以下方法检索类别:

_session.QueryOver<Data.Model.Category>()
                                     .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
                                     .List()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();
Run Code Online (Sandbox Code Playgroud)

但是我在.Contains()方法中遇到错误:

无法识别的方法调用:System.Collections.Generic.ICollection`1 [[System.Int64,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]:Boolean包含(Int64)

为什么我得到那个错误,出了什么问题?

我浏览了一些帖子,然后将查询更改为(下面),这适用于Query <>.

_session.Query<Data.Model.Category>()
                                     .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
                                     .ToList()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();
Run Code Online (Sandbox Code Playgroud)

我认为QueryOver <>是最新的和最好的,应该使用而不是Query <>.

我使用如上所示的QueryOver <>的方式有什么问题?

nhibernate fluent-nhibernate linq-to-nhibernate

19
推荐指数
2
解决办法
1万
查看次数