当前位置:  开发笔记 > 编程语言 > 正文

使用带有String的Subsonic.Select()ExecuteTypedList方法

如何解决《使用带有String的Subsonic.Select()ExecuteTypedList方法》经验,为你挑选了1个好方法。

这是一个关于泛型而不是亚音速的问题:

想象一下,如果有以下代码:

    List result = 
      DB.Select(Product.Columns.Id)
        .From()
        .ExecuteTypedList();

这很好用,并返回一个包含我的Product表中的ID的通用列表.

但是,如果我想获得ProductName的列表:

    List result = 
      DB.Select(Product.Columns.ProductName)
        .From()
        .ExecuteTypedList();

它会抛出编译器消息(翻译自德语):

"string"必须是非抽象类型,其公共构造函数不带参数,以便用作泛型类型或在泛型方法"SubSonic.SqlQuery.ExecuteTypedList()"中用作参数"T".

cause:String没有空的构造函数:

int i = new int;       // works
String s = new String; // compiler error: "string" does not contain a constructor that takes '0' argument

如果我使用它List而不是它有效,但是有更优雅的方式,我可以使用List吗?

更新:List不起作用.我确实得到了一个对象列表,但这似乎是"空"对象,不包含我的ProductNames(object.ToString()返回{Object})



1> Jürgen Stein..:

通过一点点dotnet魔术,可以在不修补亚音速代码的情况下实现.

    创建一个新类SubsonicSqlQueryExtensionMethods并删除此代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using SubSonic;
    
    namespace MyUtil.ExtensionMethods
    {
        public static class SubSonicSqlQueryExtensionMethods
        {
            public static List ExecuteTypedList(this SqlQuery qry)
            {
                List list = new List();
                foreach (System.Data.DataRow row in qry.ExecuteDataSet().Tables[0].Rows)
                {
                     list.Add((String)row[0]);
                }
                return list;
            }
        }
    }
    

现在将MyUtil.ExtensionMethods的引用添加到您的类:

    using MyUtil.ExtensionMethods;

最后这个工作:

    List result = DB.Select(User.Columns.Name).From().ExecuteTypedList();

请注意,上面的扩展方法重载了没有type-argument的ExecuteTypedList()方法(不幸的是这段代码需要dotnet 3.5,但对我来说它有效)

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有