使用 Linq 、 Reflection 、 lambda 表达式系统地将 SqlParameters 添加到 SqlParameterCollection
Posted
技术标签:
【中文标题】使用 Linq 、 Reflection 、 lambda 表达式系统地将 SqlParameters 添加到 SqlParameterCollection【英文标题】:Using Linq , Reflection , lambda expressions to systematically add SqlParameters into SqlParameterCollection 【发布时间】:2012-12-10 03:06:17 【问题描述】:public class SomeClass
public SqlParameterCollection SPPC;
public SomeClass(someType somePrameter)
....... SqlParameters assignmet with someParameter goes here .......
... ...
....... .......
foreach (var item in typeof(
GetTimesWithCustomerNames
).GetMembers()
)
SPPC.Add(item);
SqlParameter Userid = new SqlParameter();
SqlParameter Month = new SqlParameter();
SqlParameter Year = new SqlParameter();
SqlParameter ReasonId = new SqlParameter();
对于初学者来说,我在这里是因为我被困在我需要访问在这个类的主体中声明的sqlParameters
,
这些是在构造函数分配后立即添加到集合中
但是当我(希望在你的帮助下......)解决这个问题时,
我想学习一种我会坚持使用的技术,并且可能会使用,不仅在当前课程中使用此代码,因为我将能够重用该方法,它应该适用于大多数 collection
。
这意味着我可以系统地添加 - 成员/变量或不同类型的数据,而不是隐式/手动放置每一个,就像我也可以使用 other classes 成员/字段或不在同一范围内的属性在这个例子中,它使它更加实用。
我的问题是
你将如何实现这一点,使用 foreach 是不是有点过时了,因为我们可以在 Linq 上使用 lambda 表达式?
还有其他更便宜的方法可以不使用反射来达到给定类的children
吗?
我将非常感谢一个实施示例
【问题讨论】:
那么,您想访问给定类的属性/字段吗?并将它们放在列表/数组中?换句话说,SomeClass
?中的属性/字段?
@rae1n 是的 rae1n 完全正确,虽然这对于当前场景来说实际上是一个答案和正确的答案,但我真的很想学习,一些可以服务于广泛场景的方法
对了,这个设计的主要目的是什么,意思是得到classes
的children
之类的......?
【参考方案1】:
我个人会做这样的事情,
public class SomeClass
public List<SqlParameter> SPPC;
public SomeClass(someType someParameter)
SPPC = this.GetType().GetMembers().ToList();
// Or you could restrict it to only fields or properties using Where()
SPPC = this.GetType().GetMembers().Where(member => member which is of type such).ToList();
// Or use Select() to get only the value or the name of the members
SPPC = this.GetType().GetMembers().Select(member => get member value).ToList();
您只需要了解您需要从这些成员那里获得什么,因为使用反射有时会让人很困惑。
无反射
现在,如果您不想使用反射,则需要在初始化它们时手动添加它们,因此,
public class SomeClass
public List<SqlParameter> SPPC;
public SomeClass(someType someParameter)
SPPC.Add(new SqlParameter());
SPPC.Add(new SqlParameter());
SPPC.Add(new SqlParameter());
...
【讨论】:
肯定看起来不错,因为您使用最少的 1 行(:请等待,谷歌搜索List<SqlParameter>
与 SqlParameterCollection
,至于差异,同时将其最终分配给 SqlCommand.Parameters Add.. 否则为什么 MS 应该打扰另一个特定类型,它继承自更广泛的原型或专利-DBcollection
@LoneXcoder 你可以SqlParameterCollection
。我不知道他们为什么要打扰,但似乎更专业的类会更好地使用SqlCommand
API。
就谷歌发现(几乎没有)使用 SqlParameterCollection 的结果而言,我认为没有任何实现..除了最接近说使用这种类型的意思/引用sqlCommand.Parameters
- 正在SqlParameterCollection
,下一站 MSDN..
无论如何,如果我看不到任何应该像我预期的那样的答案,我将按完成关闭它..以上是关于使用 Linq 、 Reflection 、 lambda 表达式系统地将 SqlParameters 添加到 SqlParameterCollection的主要内容,如果未能解决你的问题,请参考以下文章