C# Linq-从字符串中获取值

C# Linq-从字符串中获取值,c#,asp.net,linq,webforms,C#,Asp.net,Linq,Webforms,关于SO的第一个问题——我已经读了很多很多次了,所以是时候来社区看看了 我首先从Linq查询中获取一行: var relationshipDetails = (from p in dc.tbl_ClientRelationships where p.ID == relationship_id select p).FirstOrDefault(); 然后我查看一个字符串列表(\u cols

关于SO的第一个问题——我已经读了很多很多次了,所以是时候来社区看看了

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

var relationshipDetails = (from p in dc.tbl_ClientRelationships
                           where p.ID == relationship_id
                           select p).FirstOrDefault();
然后我查看一个字符串列表(
\u cols
),它是已知的列名(以及表单项名),如下所示:

setValue()
方法基本上将返回的值分配给webcontrol(并具有确定类型和分配方式等的逻辑)

我的问题是,有没有更好的方法从已知属性值中获取Linq对象的值? 它在某些表单上有效,但最近在我身上爆炸了

否则,我很想回到旧方法,或者从DAL返回一个
DataRow
,只需简单地按名称引用即可

提前感谢,, 首先标记:

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%语法正确)

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

relationshipDetails.Id = ...
relationshipDetails.SomethingElse = ...
relationshipDetails.AnotherThing = ...
在您的情况下不起作用。

首先:

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%语法正确)

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

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

在您的情况下不起作用。

在我看来,Linq to(Sql/Entities)的最大优点之一是返回的对象是。您使用LinqToX,然后使用反射来分配值,基本上是在做老式的
DataRow
所做的事情


我不确定您为什么要尝试动态分配值。这无疑是一个。

在我看来,Linq to(Sql/Entities)的最大优点之一是返回的对象是。您使用LinqToX,然后使用反射来分配值,基本上是在做老式的
DataRow
所做的事情



我不确定您为什么要尝试动态分配值。这绝对是一个。

C#不会“爆炸”,它会抛出异常。除其他信息外,异常包括类型、消息和堆栈跟踪。是的,确实需要更好的方法,您正在使用循环中的反射。那是一个昂贵的手术。我将等待专家的回答:你为什么要积极尝试放弃类型安全性?@Jon我得到一个
系统。NullReferenceException
在线检查它是否为null。也就是说,在我检查它是否为空之前,它是空的。但是,如果我做了一个响应,请在一个工作正常的属性上写下。@RemarkLima:太好了。现在调试代码,找出表达式在以
relationshipDetails开头的链中计算为
null
的点。
.C#不是“爆炸”,而是抛出异常。除其他信息外,异常包括类型、消息和堆栈跟踪。是的,确实需要更好的方法,您正在使用循环中的反射。那是一个昂贵的手术。我将等待专家的回答:你为什么要积极尝试放弃类型安全性?@Jon我得到一个
系统。NullReferenceException
在线检查它是否为null。也就是说,在我检查它是否为空之前,它是空的。但是,如果我做了一个响应,请在一个工作正常的属性上写下。@RemarkLima:太好了。现在调试代码并找出表达式在以
relationshipDetails开头的链中计算为
null
的点。
。一切都开始单击!我以前从未与Linq完全合作过,所以我认为是时候融入其中了!像这样的信息是无价的。人们很容易被“Linq无所不能”的宣传所冲昏头脑,而一些老方法也可以做到。一切都开始点击了!我以前从未与Linq完全合作过,所以我认为是时候融入其中了!像这样的信息是无价的。人们很容易被“Linq无所不能”的宣传所冲昏头脑,而一些旧的方法也可以。谢谢你的详细回答,我现在就试试。原因如下:标记有它的文本框、复选框、下拉列表等。。。控件,所有控件的名称都以数据库的列名作为后缀。当表单加载时,它在WebControl中循环,并构建一个列名列表。然后可以使用它们创建SQL更新和插入。当加载数据时,我有问题的列名,所以只需要将它们引用到查询的对象。这听起来越来越像是我应该坚持使用旧的数据行吗?
所有的名称都以数据库的列名为后缀
您可以向加载页面的任何人公开有关数据表的详细架构信息吗?如果在代码审查中出现这种情况,我强烈建议不要这样做。这一切听起来都像是出于某种原因而试图重新创建
FormView
。它不是一个面向公众的应用程序,用户基本上已经知道模式,所以不用担心(至少在我看来)。formview可以工作,但是有很多字段需要覆盖,并且在标记上使用自定义标记,我正在根据标记的值添加验证。然而,我可能走错了路——这是众所周知的!谢谢你详细的回答,我现在就试试看。原因如下:标记有它的文本