如何根据动态字段名引用Linq中的字段

首先,为糟糕的问题标题道歉 – 不完全确定我是否正在问正确的事情。

通常我可以执行以下操作来访问字段:

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

在这种情况下,变量somevalue最终将具有字段samplefield的值。

现在我有一个场景,我想填充一个变量,但我不知道设计时表字段的名称。 但是,我确实在字符串中包含此字段名称。 因此可以使用此字符串获取值吗?

希望这是有道理的!

您需要使用reflection,如下所示:(未经测试)

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

如果你有string s = "sampleField"; ,那么你可以使用reflection:

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

如果您需要将PKID作为字符串,则它更复杂,您需要使用运行时生成的lambda。 具体如何取决于实现 – 例如,从LINQ-to-SQL中识别PK,请参阅此答案 , 该答案将查看数据上下文元数据。

奇怪的是,我刚刚在Scott 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() 

它可能需要一些动态数据引用。

为此,您需要使用reflection。

 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方法调用。

它绝对可行,但确实变得更复杂。 如果你想做一个完全动态的LINQ查询,你应该查看Scott Hanselman的这些post。

  • 每周代码示例48 – DynamicQueryable使自定义LINQ表达式更容易
  • 每周代码示例47 – ASP.NET 3.5动态数据:FilterRepeaters和动态Linq查询生成