2009-05-06 34 views
2

我有14個LINQ查詢在一種方法中解決。他們都沒有基本查詢,我可以將它們作爲子查詢掛起,然後將結果存儲爲匿名類型實例的屬性。如何在不使用基本查詢的情況下在一個操作中解析多個linq查詢?

與其單獨調用14個數據庫,我怎樣才能確保它們在同一個操作中都被調用?

UPDATE

我結束了使用該做的伎倆一個狡猾的黑客。我知道,總會有在user表中的至少一個用戶,所以我最終使用:

var data = (from tmp in DataContext.Users 
      select new { 
       Property1 = (from...), 
       Property2 = (from...), 
       PropertyN = (from...), 
      }).First(); 

更新2

它的答案中的一個已經暗示,否則可能創建MARS(多活動結果集)錯誤。這些錯誤是什麼(我從來沒有見過),它們爲什麼會發生,並且在這一問題的整個前提中是否有錯誤?也就是說,我的觀點有缺陷:要求數據庫一次性返回所有內容要比完成十四個完全獨立的LINQ查詢更快更有效?

UPDATE 3

我認爲我的做法是多餘的,從實用的角度來看,應當以不同方式處理,或者通過存儲過程或某種延遲/混合的方法。

+1

也許結果。 – 2009-05-06 19:01:38

回答

3

您仍然通過每個子查詢對數據庫進行了14次單獨調用,您只需在調用數據對象時在單個實例中執行該操作。

編輯:

,當你有一個連接多個打開的數據讀取器時出現錯誤MARS。默認情況下,SQl 2005將關閉。在你的查詢中,儘管所有的SQL都在傳遞中,但你仍然返回14個數據收集器。除非您告訴連接允許多個活動結果集(MARS),否則數據讀取器會獨佔地連接該連接。

要解決此問題,您需要將每個子查詢預加載到列表中,然後從該列表中運行子查詢,或者需要設置連接字符串= true的MutlipleActiveResultSet屬性。

<add name="Name" connectionString="Data Source=<server>;Initial Catalog=<database>;Integrated Security=True;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/> 
0

我不完全確定你的查詢,但你可以將查詢邏輯封裝在一個存儲過程中,將它與LINQ to SQL數據上下文設計器一起使用。

如果你需要獨立的結果,你真的不想往返數據庫服務器,我認爲你應該回退到SqlDataReader並使用NextResult通過調用一個檢索整個數據的過程。

+0

每一個都是一個基本的選擇語句。 – 2009-05-06 15:18:04

+0

@Nathan:你需要獨立的查詢結果嗎?或者他們相互依賴? – 2009-05-06 15:20:50

0

您可以爲每個查詢獲取SQL代碼,然後將其發送到數據塊,最後遍歷14個結果集。

0

內森,你說查詢不一定是相互依賴的,但都是相關的。我們需要知道的是,它們是否實際上有14個不同的結果集,或者它們可以合併成一個結果集。如果是後者,爲什麼不能爲此創建視圖或存儲過程?在某些情況下,您需要使用判斷來辨別何時使用其他路線以獲得更好的表現並完成工作。混合方法一點也不差。

如果您需要14個不同的結果集,您可以使用多個活動結果集(MARS),方法是在連接字符串中啓用它。這樣他們將在一次往返中完成。

0

如果返工你的「狡猾的黑客」應該simulateneously運行查詢:

var data = from a in (from x in ... select x) 
      from b in (from x in ... select y) 
      from c in (from x in ... select z) 
      select new { A = a, B = b, C = c }; 
var result = data.First(); 

然而,它會做的所有項目,這可能不是你想要什麼發生一個完整的加盟。如果使用查詢都返回相同的列數IQueryable.Concat可能工作:

var data = (from x in ... select new { Part = 1, Val = x }) 
    .AsQueryable() // may not be needed in your context 
    .Concat(
     (from y in ... select new { Part = 2, Val = y }) 
      .AsQueryable() 
      .Concat(
       (from z in ... select new { Part = 3, Val = z }).AsQueryable() 
      ) 
    ); 
foreach (result in data) 
{ 
    switch (result.Part) 
    { 
     // process each query's resultset 
    } 
} 

不過狡猾的(和未經測試),但只打了DB一次。

0

我不確定查詢用戶表是否真的幫助你。

在編寫LINQ查詢之前,請嘗試考慮如何使用基本SQL實現目標。

我不確定你想要做什麼,因爲你沒有提供太多的代碼,但是,如果你要在一個存儲過程中這樣做,那會是什麼樣子,它會返回什麼樣的結果?

我在問這個,因爲可能你需要的數據結構不適合單個查詢。

如果是這樣,那麼你只需要重新考慮你是整個LINQ方法。

也許你可以提供更多關於什麼數據你實際試圖檢索,以及如何?

歡呼

0

不知道這是否會有所幫助,但想知道爲什麼你會不使用let關鍵字,以提高查詢。

「讓」允許您運行子查詢,並存儲在一個臨時變量,然後你就可以進一步在主查詢,如果您有它的代碼可能會提供更多刺激的一些樣品使用

相關問題