2013-09-25 56 views
1

擴展查詢我有以下情況:EF每箱

我需要在一個EF上下文中執行以下LINQ查詢

from table1 in context.TableOne 
join table2 in context.TableTwo on table1.SomeFKId equals table2.Id 
join table3 in context.TableThree on table2.SomeFKId equals table3.Id 
... 
join tableN in context.TableN on tableN_1.SomeFKId equals tableN.Id 
where case1 && case2 && case3 ... && caseN 
select new TablesDto { VarOne = table1.Var , VarTwo = tableN_2.var } 

我的問題是,我想使用向度的同一查詢senarios有很多延伸。 我寧願不多次寫(DRY原則),只是擴大它,但不以犧牲效率和速度爲代價。

這就是說,如果我想將第一個表與另一個表連接起來,我可以擴展Dto以合併其餘的變量,但是如果我要遍歷行,則需要每行的查詢來擴展它。由於我在談論100到5000行,即使迭代也需要一些時間。

擴展包括:其他情況(case1,case2等)和其他連接。

Extention例子:

from table1 in context.TableOne 
join table2 in context.TableTwo on table1.SomeFKId equals table2.Id 
join table3 in context.TableThree on table2.SomeFKId equals table3.Id 
... 
join tableN in context.TableN on tableN_1.SomeFKId equals tableN.Id 
join extTable in context.TableExt on table2.SomeFKId equals extTable.Id 
where case1 && case2 && case3 ... && caseN || extTable.NumOfSmth == 4 
select new ExtTablesDto { VarOne = table1.Var , VarTwo = tableN_2.var , ExtVar = extTable.Name } 
+0

這將有助於看到的例子兩種不同的情況。我不明白倒數第二段。我也想知道「其他連接」應該如何參數化。 –

+0

'TablesDto'總是一樣嗎?恐怕你試圖擦自己,所以DRY會受到傷害。 –

+0

不要每次更改dto。但是,DTO是別人 –

回答

1

嘗試......

void Main() 
{ 
    using(var dal = new DataAccessLayer()) 
    { 
     var items = dal.TablesDtoQuery.Case1().Case2().ToList(); 
    } 
} 

public class DataAccessLayer : IDisposable 
{ 
    private DbContext context; 

    public void Dispose() 
    { 
     context.Dispose(); 
    } 

    public IQueryable<TablesDto> TablesDtoQuery 
    { 
     get 
     { 
      return 
       from table1 in context.TableOne 
       join table2 in context.TableTwo on table1.SomeFKId equals table2.Id 
       join table3 in context.TableThree on table2.SomeFKId equals table3.Id 
       ... 
       join tableN in context.TableN on tableN_1.SomeFKId equals tableN.Id 
       where case1 && case2 && case3 ... && caseN 
       select new TablesDto { VarOne = table1.Var , VarTwo = tableN_2.var }; 
     } 
    } 
} 

public static class TablesDtoQueryExtension 
{ 
    public IQueryable<TablesDto> Case1(this IQueryable<TablesDto> query) 
    { 
     return from t in query 
      where ... 
      select t; 
    } 

    public IQueryable<TablesDto> Case2(this IQueryable<TablesDto> query) 
    { 
     return from t in query 
      where ... 
      select t; 
    } 
} 
+0

將嘗試它並接受答案,如果它的工作。 –

+0

謝謝隊友,我注視着進一步擴展的方法,基本類等的例子,我終於得到它在稍許不同的方式。 –

1

可以延長在那裏查詢很容易這樣

var query = from user in dbContext.Users where user.id = 10; 

if (x == 3) 
{ 
    query = query.where(p=>p.name == "test"); 
} 

等等,你可以在這裏擴展基本的查詢用戶ID = 10和名稱後,你將搜索=「測試」

如果你有一個EF模型,那麼你應該嘗試創建表之間存在的依賴關係,那麼你就需要加入他們在您的查詢

+0

我有依賴的基類,但我在這裏尋找速度,這就是爲什麼我伸出我的屬性數據在一個查詢,而不是多個。我的設計不允許我使用急切的數據提取。該解決方案還將執行2個查詢而不是1個查詢。我可以使用它來擴展Where子句,但不能加入我的連接。 –

+2

@AhanhaniosKataras「執行2個查詢而不是1個」。不對。在調用IEnumerable.GetEnumerator()之前''DbQuery/ObjectQuery'不會觸發數據庫。 – Aron

+0

對不起,這是事實。你是對的,它仍然不能解決連接問題。 –