2012-07-11 70 views
0

我想寫一個LINQ到SQL查詢,並根據用戶提供的輸入字符串動態選擇在運行時選擇哪個表。現在我有一個選擇語句可以做到這一點,但它只是重複三次相同的查詢,唯一不同的是選定的表格。有點像這樣:Linq to SQL:在運行時動態選擇表

if (input == "94") 
{ 
    var query = from i in db.Table94 
     select new MyClass(i.A, i.B, i.C); 
} 

if (input == "95") 
{ 
    var query = from i in db.Table95 
     select new MyClass(i.A, i.B, i.C); 
} 

//more conditional queries 

query = query.Where(addtionalFilteringDoneHere); 
DataGridView.DataSource = query; 

它很容易使用條件Where子句,但我正在尋找類似的表選擇。我厭倦了一些事情,但他們沒有工作。例如:

var query = from i in FetchTable(input) 
    select new MyClass(i.A, i.B, i.C); 

query = query.Where(addtionalFilteringDoneHere); 

public returnType FetchTable(string input) 
{ 
    //need help here 
    return db.GetTable<conditionalTable>; 
} 

我不知道返回類型是什麼,或者即使有辦法做到這一點。可能嗎?

+0

這個重複嗎? http://stackoverflow.com/questions/1919632/get-table-data-from-table-name-in-linq-datacontext – 2012-07-11 19:29:28

+0

這個例子有點令人誤解。兩個查詢最後都有投影,所以在這兩種情況下,都有'IEnumerable '作爲結果。如果表達式類型始終相同,那麼應用過濾器是一項顯而易見的任務。 – 2012-07-11 19:34:22

回答

0

由於您試圖從不同的表創建MyClass實例,因此您可能會遇到創建動態查詢的問題 - 這意味着您會拋出EF或LINQ-to-SQL - 或者您要進行基本查找。

我建議基礎查詢和你做這樣的事情:

var fetch = new Dictionary<string, Func<Context, IQueryable<MyClass>>>() 
{ 
    { "94", db => db.Table94.Select(i => new MyClass(i.A, i.B, i.C)) }, 
    { "95", db => db.Table95.Select(i => new MyClass(i.A, i.B, i.C)) }, 
}; 

這將創建一個通用的字典,您現在可以輕鬆拿出你的MyClass實例中的一個強類型的查詢。

事情是這樣的:

var query = fetch[input](db).Where(addtionalFilteringDoneHere); 
DataGridView.DataSource = query; 

你可以使用fetch[input].Invoke(db),如果你喜歡的語法更好。

這看起來像一個解決方案?