2011-08-14 72 views
3

我想傳遞一個列名到一個類,並從sql數據庫中檢索該列的值。看起來像Field <>不適用於表格,但它可以與DataTable一起使用。有人能指出我如何使用linq做到這一點?我相信這是一件非常簡單的事情。謝謝。使用Field <>與Linq到SQL

[Table(Name = "[Keys]")] 
public class Keys 
{ 
    [Column] 
    public string Column_A{ get; set; } 
    [Column] 
    public string Column_B{ get; set; } 
    [Column] 
    public string Column_C{ get; set; } 
} 

    public string ReadKey(string DBKey) 
{ 
    DataContext dc = new DataContext(sqlconn); 
    Table<Keys> keysTable = dc.GetTable<Keys>(); 

    var query = from k in keysTable.AsEnumerable() 
    select k.Field<string>("DBKey");  <---------------- wrong 

} 

回答

3

Field<>爲LINQ到數據表,並且被包括作爲擴展到System.Data。這不是標準的LINQ擴展方法。看到這個如何使用LINQ to DataTables的問題。

您要做的事可以通過使用表達式或Dynamic LINQ來完成。動態LINQ並不是.NET的附件。它被包括在VS2008中作爲一個例子,人們繼續使用它。我不確定它是否受到Microsoft的支持,更新等。在將其納入框架之前,我不會相信它。

您可以創建一個方法來創建喬恩的答覆中提到這樣的selector

public Expression<Func<Keys,T>> GetSelectLambda<T>(string propertyName) 
{ 
    ParameterExpression lhsParam = Expression.Parameter(typeof(Keys), "s"); 
    Expression fieldParam = Expression.Property(lhsParam, propertyName); 
    var theExpression = Expression.Lambda<Func<Keys, T>>(fieldParam, lhsParam); 
    return theExpression; 
} 

所以傳遞GetSelectLambda<string>("DBKey")應該產生的s => s.DBKey拉姆達隨後將其返回並傳遞到Jon的方法。

希望這會有所幫助。

+0

非常感謝您的幫助! – Gary

+0

很高興我能幫到你。 –

2

您通常不應該使用列名稱與LINQ to SQL - 使用無類型DataTable對象的LINQ to SQL的好處之一是您可以獲得更多的編譯時安全性。

如果你需要允許選擇不同的列,您可以使用表達式樹來選擇他們:

public string ReadKey(Expression<Func<Keys, string>> selector) 
{ 
    DataContext dc = new DataContext(sqlconn); 
    Table<Keys> keysTable = dc.GetTable<Keys>(); 

    // Generally speaking you don't want to use AsEnumerable here... 
    var query = keysTable.Select(selector); 
    // Now do something with query 
} 

注意,使用GetTable很少一個偉大的想法 - 通常你一起工作具體DataContext上的具體表格。

+0

太棒了!它終於有效。非常感謝! – Gary

相關問題