2010-01-27 54 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

相关问题