使用 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 完全正确,虽然这对于当前场景来说实际上是一个答案和正确的答案,但我真的很想学习,一些可以服务于广泛场景的方法 对了,这个设计的主要目的是什么,意思是得到classeschildren之类的......? 【参考方案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&lt;SqlParameter&gt;SqlParameterCollection ,至于差异,同时将其最终分配给 SqlCommand.Parameters Add.. 否则为什么 MS 应该打扰另一个特定类型,它继承自更广泛的原型或专利-DBcollection @LoneXcoder 你可以SqlParameterCollection。我不知道他们为什么要打扰,但似乎更专业的类会更好地使用SqlCommand API。 就谷歌发现(几乎没有)使用 SqlParameterCollection 的结果而言,我认为没有任何实现..除了最接近说使用这种类型的意思/引用sqlCommand.Parameters - 正在SqlParameterCollection,下一站 MSDN.. 无论如何,如果我看不到任何应该像我预期的那样的答案,我将按完成关闭它..

以上是关于使用 Linq 、 Reflection 、 lambda 表达式系统地将 SqlParameters 添加到 SqlParameterCollection的主要内容,如果未能解决你的问题,请参考以下文章

Linq + Reflection通过字段名称和条件从列表中获取元素

如何将 SQL 中的多个内部联接转换为 LINQ?

最高效率的对象深拷贝通用方法

QueryableHelper

C#MongoDbCsharpHelper

Linq基础知识小记三