关于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
,只是轻易引用名字!
提前致谢, 标记
答案 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 = ...
在你的情况下无效。