将 Subsonic.Select() ExecuteTypedList 方法与字符串结合使用

2024-01-07

这更多是关于泛型而不是亚音速的问题:

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

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

这非常有效,并返回一个通用列表,其中包含我的产品表中的 id。

但如果我想获取 ProductName 的列表:

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

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

“string”必须是非抽象类型 与公共构造函数没有 参数,以便用作 泛型类型或泛型方法中 “SubSonic.SqlQuery.ExecuteTypedList()” 作为参数“T”。

原因:字符串没有空构造函数:

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

如果我使用List<Object>相反,它可以工作,但是有没有一种更优雅的方式,我可以使用List<String> ?

Update: List<Object>不起作用。我确实得到了一个对象列表,但似乎是“空”对象,不包含我的 ProductNames ( object.ToString() 返回{Object} )


借助一点 dotnet 魔法,无需修补亚音速代码就可以实现。

  1. 创建一个新类 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<String> ExecuteTypedList(this SqlQuery qry)
            {
                List<String> list = new List<String>();
                foreach (System.Data.DataRow row in qry.ExecuteDataSet().Tables[0].Rows)
                {
                     list.Add((String)row[0]);
                }
                return list;
            }
        }
    }
    

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

    using MyUtil.ExtensionMethods;

最后这有效:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Subsonic.Select() ExecuteTypedList 方法与字符串结合使用 的相关文章

随机推荐