这是一个关于泛型而不是亚音速的问题:
想象一下,如果有以下代码:
Listresult = DB.Select(Product.Columns.Id) .From () .ExecuteTypedList ();
这很好用,并返回一个包含我的Product表中的ID的通用列表.
但是,如果我想获得ProductName的列表:
Listresult = 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}
)
通过一点点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 ListExecuteTypedList(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;
最后这个工作:
Listresult = DB.Select(User.Columns.Name).From ().ExecuteTypedList();
请注意,上面的扩展方法重载了没有type-argument的ExecuteTypedList()方法(不幸的是这段代码需要dotnet 3.5,但对我来说它有效)