Linq - 从字符串中获取值

时间:2012-03-21 18:13:47

标签: c# asp.net linq webforms

关于SO的第一个问题 - 我已经阅读过很多次了很多次,所以有时间在社区中沾沾自喜!

我首先从Linq查询中获取一行:

var relationshipDetails = (from p in dc.tbl_ClientRelationships
                           where p.ID == relationship_id
                           select p).FirstOrDefault();

然后我查看一个字符串列表(_cols),这是已知的列名(以及表单项名称),如下所示:

foreach (string c in _cols)
    {
      if (relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString() != null)
        {
           setValue(relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString(), c);
         }
     }

setValue()方法基本上将返回的值赋给webcontrol(并且具有确定类型以及如何分配的逻辑等等。)

我的问题是,有没有更好的方法从知道的属性值中获取Linq对象的值? 它适用于某些形式,但最近刚刚炸毁了我!

否则,我很想回到旧方法或从DAL返回DataRow,只是轻易引用名字!

提前致谢, 标记

2 个答案:

答案 0 :(得分:2)

Linq对(Sql / Entities)的最大优势之一(在我看来)是返回的对象是strongly-typed。您正在使用LinqToX,然后使用反射来分配值,您基本上就是在做旧学校DataRow所做的事情。

我不确定你为什么要动态分配值。这肯定是XY Problem

答案 1 :(得分:1)

首先:

var relationshipDetails = (from p in dc.tbl_ClientRelationships
                          where p.ID == relationship_id
                          select p).FirstOrDefault();

Linq查询是表示查询的对象,将它们分开并与这些查询的结果区分开来。在这种情况下,我会建议这样的事情:

var relationshipDetails = dc.tbl_ClientRelationships
                              .FirstOrDefault( p => p.Id == relationship_id);

现在,这将非常缓慢:

foreach (string c in _cols)
{
  if (relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString() != null)
    {
       setValue(relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString(), c);
     }
 }

您可以轻松获得对反射成员的引用并减少开销,可能是这样的:(可能不是100%语法正确)

var properties = relationshipDetails.GetType().GetProperties();

foreach (string c in _cols)
{
    var currentProperty = properties.Single( p=> p.Name == c );

    if (currentProperty.GetValue(relationshipDetails, null) != null)
    {
        setValue(currentProperty.GetValue(relationshipDetails, null).ToString(), c);
    }
}

最后 - 你为什么要这样做?请详细说明您要执行的操作,以及为什么以类型安全命名方式引用列,即:

relationshipDetails.Id = ...
relationshipDetails.SomethingElse = ...
relationshipDetails.AnotherThing = ...

在你的情况下无效。