簡體   English   中英

在Linq to NHibernate中測試狀況的最佳方法是什么?

[英]What is the best way to test a condition in Linq to NHibernate?

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()行為被認為是正常的還是錯誤? 這對我來說似乎不是最佳選擇,但是也許加載實體並不比要求SQL返回計數慢嗎?

有鑒於此, 什么是在Linq to 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)。

但是,當要檢索的行數量很多時,它通常更適合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM