gpt4 book ai didi

c# - 将 Subsonic.Select() ExecuteTypedList 方法与字符串一起使用

转载 作者:行者123 更新时间:2023-11-30 20:14:07 25 4
gpt4 key购买 nike

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

想象一下如果有下面的代码:

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

效果很好,并返回一个通用列表,其中包含我的 Product 表中的 ID。

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

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

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

"string" has to be a non-abstract type with a public Constructor without parameter, in order to be used as a generic type or in the generic method "SubSonic.SqlQuery.ExecuteTypedList()" as param "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>

更新: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,但对我来说它有效)

关于c# - 将 Subsonic.Select() ExecuteTypedList 方法与字符串一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/881929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com