什么是测试林克对NHibernate病情的最佳方法

本文关键字:病情 最佳 方法 NHibernate 测试 林克 什么 | 更新日期: 2023-09-27 18:21:09

Any()linq函数似乎可以加载实体的所有列,即使它们不是必需的。

以下代码:

if(Session.Query<Project>().Any(p=>p.ID == projectID && p.ProjectOwner.Responsible == CurrentUserID))
    // Current user is the responsible for this project

生成以下SQL:

select TOP (1) project0_.ProjectID                          as ProjectID7_,
               project0_.DateCreated                        as DateCrea2_7_,
               project0_.Type                               as Type7_,
               project0_.ProjectOwner_FK                    as ProjectOy8_7_,
               project0_.Address_FK                         as Address9_7_,
**[Snip -- the statement selects all of Project's columns]**
from   [Project] project0_
       inner join [OrganizationProject] organizati1_
         on project0_.ProjectOwner_FK = organizati1_.OrganizationProjectID
where  project0_.ProjectID = 1 /* @p0 */
       and organizati1_.Responsible_FK = 1 /* @p1 */

但是,以下代码:

if(Context.Projects.Where(p=>p.ID == projectID && p.ProjectOwner.Responsible == CurrentUserID).Count() == 1)
    // Current user is the responsible for this project

生成以下sql,这是预期的:

select cast(count(*) as INT) as col_0_0_
from   [Project] project0_
       inner join [OrganizationProject] organizati1_
         on project0_.ProjectOwner_FK = organizati1_.OrganizationProjectID
where  project0_.ProjectID = 1 /* @p0 */
       and organizati1_.Responsible_FK = 1 /* @p1 */

Count()方法可以完成预期的操作,但它不那么简单。

Any()行为被认为是正常的还是bug?对我来说,这似乎不是最好的,但加载实体可能并不比要求SQL返回计数慢吗?

鉴于此,什么被认为是测试Linq到NHibernate条件的最佳方法

什么是测试林克对NHibernate病情的最佳方法

这很有趣,但你试过了吗:

if(Session.Query<Project>()
   .FirstOrDefault(p=>p.ID == projectID 
                 && p.ProjectOwner.Responsible == CurrentUserID) != null)

我认为从你目前的选择来看会更快。事实上,它不会检查所有项目(如count),也不会获取所有数据。

类似的操作应该创建一个只有一列的查询:

if(Session
    .Query<Project>()
    .Where(p=>p.ID == projectID && p.ProjectOwner.Responsible == CurrentUserID)
    .Select(p=>new { pID = p.ID })
    .Any())
{
   ...
}

投影到匿名类型允许NHibernate只获取指定的列(例如ID)。

但是,当有大量的行要检索时,它通常更合适。