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

时间:2010-01-27 15:52:57

标签: c# linq

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

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

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

在这个例子中,变量 somevalue 最终会得到字段 samplefield 的值。

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

希望这是有道理的!

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

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

如果您需要将PKID作为字符串,则它更复杂,您需要使用运行时生成的lambda。 完全如何略微依赖于实现 - 例如,要从LINQ-to-SQL中识别PK,请参阅查看数据上下文元数据的this answer

答案 2 :(得分:3)

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

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

答案 3 :(得分: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方法调用。

答案 4 :(得分:2)

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