2011-10-20 40 views
7

我正在訪問遠程數據源,發現組聯接導致IQueryable查詢轉換爲IEnumerable,問題:這會影響性能嗎?我想卸載儘可能多的查詢到數據庫成爲可能,而不是執行內存什麼...組連接導致IQueryable變成IEnumerable,爲什麼?

var allusers = repo.All<User>().Where(x => x.IsActive); 
var _eprofile = repo.All<Profile>() 
    .Where(x => x.IsProfileActive) 
    .Join(allusers, x => x.UserID, y => y.UserID, (x, y) => new 
    { 
     eProfile = x, 
     profile = y 
    }) 
    .GroupJoin(_abilities, x => x.eProfile.ID, y => y.ID, (x, y) => new QuoteDTO 
    { 
     UserID = x.profile.Login, 
     Email = x.profile.Email, 
     Tel = x.profile.Tel, 
     Mobile = x.eProfile.Mobile, 
     CompanyID = x.profile.CompanyID, 
     Ability = y.Select(c => new AbilityDTO 
    { 
     Name= c.Name 
    }) 

    }); 

行: .GroupJoin(_abilities,X => x.eProfile.ID ,Y => y.ID,(X,Y)=>新QuoteDTO

  1. _abilities是一個IQueryable,得到了一個用戶的能力,對象
  2. 的第二部分(x的集合,y) - 這裏y被轉換成IEnumerable ...

var cLists = List<int>(); //這個集合從客戶端代碼填充,可以說,它 //包含1,3,55爲了討論...

var _abilities= repo.All<UserAbility>() 
     .Where(x => x.Status == Status.Active.ToString()) 
     .Where(x => cLists.Contains(x.CompetencyID)); 

注:的我的原因使用VAR是使插入的DTO對象之前,我可以變成我喜歡的對象,我用了很多匿名類型的...

+0

哪一位被「轉換成IEnumerable」?什麼是可用性? –

+0

它的一個子查詢,我已經更新了上面的代碼... – Haroon

+0

'_abilities'是一個'IQueryable'嗎?你所有變量的數據類型是什麼?請不要使用'var',我們不能推斷變量類型和編譯器。 – Greg

回答

1

的IQueryable的定義:

public interface IQueryable<T> : IEnumerable<T>, IQueryable, IEnumerable 

...和的ObjectQuery:

ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>, IQueryable<T>, IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable, IListSource 

大多數(?全部)LINQ表達式返回一個對象鑄爲IEnumerable。但是對象的類型仍然是它開始的類型。

不,數據庫在LINQ-to-Entities查詢轉換爲IEnumerable時未命中,因此性能不會受到影響。你可以,如果你願意,可以上傳到IQueryable或ObjectQuery。

編輯:爲了說明起見,在ObjectQuery,IQueryable或IEnumerable的實例上調用ToArray()會觸發數據庫並檢索結果集。

編輯:在查詢中創建一個新的對象(即新的QuoteDTO)將命中數據庫,因爲沒有辦法將新對象存儲在SQL查詢中。對不起,我錯過了那一點。

+0

它看起來好像我的代碼實際上確實擊中數據庫的子查詢,這是我的實際問題,我想問上述問題也會幫我解決這個問題 – Haroon

+0

你'再右吧。我編輯了我的答案。在查詢中創建一個「新」對象將會擊中數據庫並返回結果集。 – ken

+0

所以我應該爲每個查詢創建一個匿名對象,那樣我就不會碰到數據庫? – Haroon

相關問題