这更多是关于泛型而不是亚音速的问题:
想象一下如果有以下代码:
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 魔法,无需修补亚音速代码就可以实现。
-
创建一个新类 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(使用前将#替换为@)