如何将SQL结果转换为C#中的对象列表?

时间:2010-08-23 23:44:06

标签: c# sql

我正在努力将Web应用程序转换为WPF桌面应用程序。我想使用现有的数据访问层,所以我不必重写所有的SQL查询。

但是,就目前而言,几乎所有内容都是从SQL查询返回的DataTables中填充的。为了使事情更易于管理,在某些情况下,将这些事物转换为对象真的很不错。

例如,我有一个提取报告信息的查询。我可以使用ReportID,ReportTitle,ReportDate等列获得500个结果。

我想创建一个具有这些公共属性的报表类,并以某种方式将SQL查询结果转换为这些报表对象的集合。

这样做的最佳方式是什么?

如果有一种简单的倒退方式(如果对象被更改,则更新数据库)可获得超级奖励积分。

4 个答案:

答案 0 :(得分:5)

您应该了解Object-Relational Mapping (ORM)。一个好的ORM可以在将来为您节省大量的工作,并从您的代码中获取那些讨厌的查询。

我建议NHibernateEntity Framework 4.0

答案 1 :(得分:4)

虽然我也想建议ORM(NHibernate是要走的路:) :)一个可能的解决方案是:

public IEnumerable<Report> ToReportList(DataTable dt)
{
  return dt.AsEnumerable().Select(dr => new Report
                                        {
                                            member1 = dr["column1"].ToString(),
                                            ...
                                        });
}

顺便说一下,报告是你的班级。例如,

internal class Report
{
  public string member1{ get; set;}
  ...
}

您可能还想检查一下,

我认为如果你搜索stackoverflow,你会发现更好的例子,因为我记得从这里学到这一点。

顺便说一下,如果你使用NHibernate,你根本不必重写你的查询。您所要做的就是将您的桌子映射到一个班级,并且您可以将它放在一边。它将处理你所有的DML内容(主要是),你可以很容易地告诉ORM做LazyLoad,Batch处理等非常酷。

  

如果有一个简单的超级奖励积分   倒退的方式(更新   数据库,如果对象被更改)。

为此,去ORM即NHibernate(我知道我有偏见:))。对于LINQ to SQL示例,请查看以下2个链接:

答案 2 :(得分:1)

+1 ORM。实体框架很好,LINQ to SQL也很好,但是你需要一个好的数据库设计,并且对于非常基本的SQL CRUD操作更好。对于来自多个数据源的自定义实体,我会去EF。

至于向后更新 - LINQ to SQL有一个简单易用的实现,就像这样 - 比如说你有一个名为MyDatabase的数据库,里面有Dog实体:

using(MyDatabaseDataContext db = new MyDatabaseDataContext())
{
    //LINQ will automatically pluralize your items (entity named Dog becomes Dogs)
    Dog d = db.Dogs.Where(x=>x.DogName.Equals(dogName));
    d.Owner = "Steve";
    db.SubmitChanges();
    //adding new items is easy too
    Dog newdog = new Dog();
    newDog.DogName = "Scruff";
    newDog.Owner = "Jim";
    db.Dogs.Add(newDog);
    db.SubmitChanges();
}

答案 3 :(得分:0)

查看此方法。首先,您可以创建一个继承DataContext的类。然后你可以使用DataContext的方法,比如ExecuteQuery&lt;&gt;将结果转换为对象。使用此方法,您可以直接使用先前编写的查询。此外,我觉得这种方式比维护.dbml文件要好得多,因为与实际数据库模式同步的问题相关。

考虑以下示例。首先,您需要定义一个用于与数据库交互的类

public class DBManagerDataContext : DataContext
{
    private static string connectionString = ""; // Your connection string

    public static DBManagerDataContext CreateInstance()
    {
        return new DBManagerDataContext(connectionString);
    }

    protected DBManagerDataContext(string connectionString)
        : base(connectionString, new AttributeMappingSource())
    {

    }
}

然后,您可以使用此上下文执行查询并将其转换为对象,如下所示:

public class Report
{
    public int ReportID;
    public string ReportTitle;
    public DateTime ReportDate;

    private static string query = "select ReportID, ReportTitle, ReportDate from dbo.Reports"; // Your query

    public static List<Report> GetReportList()
    {
        DBManagerDataContext context = DBManagerDataContext.CreateInstance();
        return context.ExecuteQuery<Report>(query).ToList();
    }
}

您可以使用上面给出的方法“GetReportList()”,例如:

List<Report> reports = Report.GetReportList();

在更新的情况下,“jdandison”建议的方法是一个不错的选择,除了使用上面的数据上下文。在更新的情况下,它将是“ExecuteCommand”。请浏览DataContext类以获取更多信息。

编辑:请注意,查询列名称应与对象

中的定义匹配