2013-07-17 90 views
3

我在用戶組內有動態字段,我想根據用戶組的用戶來選擇它們。SelectMany查詢太多

基本上我想模擬像.Where(x => x.UserGroupId == x || ...這樣的查詢,因爲否則它會產生大約20個查詢來獲取動態字段。

也許我可以以某種方式傳遞整數數組作爲UserGroupId,它將模擬與||查詢。

這是我的例子中,兩個結果輸出是相同的,唯一的區別是第一個具有20個查詢數據庫和第二僅具有1

public IEnumerable<UserGroup> UserGroups 
{ 
    get 
    { 
     var db = new MainDataContext(); 
     return db.UserGroupUsers.Where(x => x.UserId == this.Id).Select(x => x.UserGroup); 
    } 
} 
public IEnumerable<UserDynamicField> DynamicFields 
{ 
    get 
    { 
     var db = new MainDataContext(); 

     var fields = this.UserGroups.SelectMany(x => x.UserGroupDynamicFields); // 20+ queries 

     var fields2 = db.UserGroupDynamicFields.Where(x => 
      x.UserGroupId == 1 || 
      x.UserGroupId == 2 || 
      x.UserGroupId == 3 || 
      x.UserGroupId == 4 || 
      x.UserGroupId == 5 || 
      x.UserGroupId == 6 || 
      x.UserGroupId == 7 || 
      x.UserGroupId == 8 || 
      x.UserGroupId == 9 || 
      x.UserGroupId == 10); // 1 query, maybe I can somehow pass array of Id's here? 
    } 
} 

回答

2

嘗試將其轉換爲IQueryable<T>代替IEnumerable<T>

public IQueryable<UserGroup> UserGroups 
{ 
    get 
    { 
     var db = new MainDataContext(); 
     return db.UserGroupUsers.Where(x => x.UserId == this.Id) 
           .Select(x => x.UserGroup); 
    } 
} 
public IQueryable<UserDynamicField> DynamicFields 
{ 
    get 
    { 
     // 1 query 
     return this.UserGroups.SelectMany(x => x.UserGroupDynamicFields); 
    } 
} 

這將使LINQ到採取的事實,它不具有拉動的結果,直到它的迭代內存設置的優勢,所以這將轉換到傳統的SQL連接。

+0

該死!這很容易,我認爲這會更困難。謝謝:) – sed

+1

@Steve很高興幫助。一般而言,如果您將集合保留爲'IQueryable ',那麼在其上執行的任何Linq方法都將在數據庫上運行,而不是在本地運行的'IEnumerble '。然而,它們都利用了懶惰執行的優勢,所以在你真正嘗試獲得結果之前它不會運行。 –

+0

是的,但'DynamicFields'應該可以保留'IEnumerable',因爲它使用'yield return',我不能使用'IQueriable'。 – sed