2011-02-08 123 views
0

我想使用我的LINQ到SQL查詢之一的編譯查詢。該查詢包含5到6個連接。我能夠創建編譯查詢,但我面臨的問題是我的查詢需要檢查密鑰是否在作爲輸入傳遞的密鑰集合中。但編譯查詢不允許傳遞集合(因爲集合可能有不同數量的項目因此不允許)。LINQ到SQL編譯查詢幫助

例如

輸入到功能是鍵的集合。你說:List<Guid> InputKeys

List<SomeClass> output = null; 
    var compiledQuery = CompiledQuery.Compile<DataContext, List<Guid>, IQueryable<SomeClass>>(
         (context, inputKeys) => from a in context.GetTable<A>() 
            where inputKeys.Contains(a.Key) 
            select a); 

    using(var dataContext = new DataContext()) 
    { 
      output = compiledQuery(dataContext, InputKeys).ToList(); 
    } 

    return output; 

上面的查詢沒有編譯,因爲它正在採取列表作爲一個輸入。是否有任何解決方法或更好的方式來做到上述?

+0

你可以使用常規查詢而不是編譯的嗎? – Gabe 2011-02-09 07:44:25

回答

0

我不確定這是可能的只使用Linq to SQL。我想你需要在服務器上寫一個存儲過程或函數,讓你傳入一個代表你的列表的分隔字符串,並解析返回一個表,然後你可以對它進行比較。

我認爲最簡單的方法是編寫(或讓你的DBA編寫)整個東西作爲存儲過程,它仍然需要把你的列表作爲它的參數的字符串,調用上述的分離器功能。存儲過程將由服務器預編譯其執行計劃。

您可以輕鬆地讓你的名單分成使用LINQ的東西串像

string[] strings = new string[4] { "1", "2", "3", "4" }; 

string listOfStrings = strings.Aggregate((acc, s) => acc = acc + ", " + s); 

您可以打開,可轉換爲字符串轉換成字符串的IEnumerable與

IEnumerable<string> strings = list.Cast<string>(); 
的任何一個列表

然後,您可以將存儲過程添加到您的dbml文件,並使用Linq to SQL調用它。

我似乎記得Linq to SQL爲了保持一般性,不處理事物列表,並將所有傳遞給列表中每個條目的列表轉換爲參數。