2010-01-27 59 views
6

首先,對不好的問題標題表示歉意 - 並不完全確定我是否詢問正確的事情。如何根據動態字段名稱引用Linq中的某個字段

通常,我可以執行以下操作來訪問字段:

MyTables table = dc.MyTables.SingleOrDefault(p => p.id == someId); 
somevalue = table.samplefield; 

在這種情況下可變someValue中最終會具有samplefield領域的值。

現在我有一個場景,我想填充一個變量,但在設計時我不知道表字段的名稱。然而,我確實在字符串中有這個字段名。因此可以使用這個字符串獲取一個值嗎?

希望這是有道理的!

+0

你知道哪些 - 「id」或「sampleField」? – 2010-01-27 15:56:41

+0

@Marc:sampleField – Martin 2010-01-27 15:58:35

回答

5

你需要使用反射,這樣的:(未經測試)

somevalue = typeof(MyTable).GetProperty(fieldName).GetValue(table, null); 
2

爲了做到這一點,您需要使用反射。

public object GetField(object obj, string fieldName) { 
    var t = obj.GetType(); 
    var field = t.GetField(fieldName); 
    return field.GetValue(obj); 
} 

somevalue = GetField(table, "someFieldName"); 

只要該字段既是實例又是公共的,就可以工作。如果可訪問性不夠公開,您需要稍微修改GetField方法調用。

+0

LINQ to SQL是否真的使用字段而不是屬性? – SLaks 2010-01-27 15:57:17

+0

@Slaks,不知道,但OP說在問題裏面的領域,所以我跟場。 – JaredPar 2010-01-27 15:57:40

2

這絕對是可行的,但確實變得更復雜。如果你想做一個完全動態的LINQ查詢,你應該查看Scott Hanselman的這些帖子。

+0

看到所有的答案後,我肯定錯過了船。根本不需要LINQ。這裏顯示的反射方法正是你所需要的。 – smaclell 2010-01-27 16:01:27

3

如果你有string s = "sampleField";,那麼你可以使用反射:

object value = table.GetType().GetProperty(s).GetValue(table, null); 

如果您需要PKID作爲字符串,則更爲複雜,您需要使用運行時生成的lambda。 確切地說如何略微依賴實現 - 例如,從LINQ到SQL中標識PK,請參閱this answer,它查看數據上下文元數據。

2

古怪我剛纔讀過的斯科特Hanselman的博客類似的東西,這是設置一個字段名的地方或排序在一個字符串,但我認爲選擇可以以同樣的方式來完成。請參閱:

http://www.hanselman.com/blog/TheWeeklySourceCode48DynamicQueryableMakesCustomLINQExpressionsEasier.aspx

的核心是這樣的:

Dim Northwind As new NorthwindDataContext 
Dim query = Northwind.Products 
     .Where("CategoryID=2 And UnitPrice>3") 
     .OrderBy("SupplierID") 
GridView1.DataSource = query 
GridView1.DataBind() 

它可能需要一些動態數據引用。

+0

我喜歡這個解決方案比反射更好,因爲它可以用於像Linq to SQL這樣的IQueryables – 2010-01-27 16:13:37

相關問題