我正在努力将Web应用程序转换为WPF桌面应用程序。我想使用现有的数据访问层,所以我不必重写所有的SQL查询。
但是,就目前而言,几乎所有内容都是从SQL查询返回的DataTables中填充的。为了使事情更易于管理,在某些情况下,将这些事物转换为对象真的很不错。
例如,我有一个提取报告信息的查询。我可以使用ReportID,ReportTitle,ReportDate等列获得500个结果。
我想创建一个具有这些公共属性的报表类,并以某种方式将SQL查询结果转换为这些报表对象的集合。
这样做的最佳方式是什么?
如果有一种简单的倒退方式(如果对象被更改,则更新数据库)可获得超级奖励积分。
答案 0 :(得分:5)
您应该了解Object-Relational Mapping (ORM)。一个好的ORM可以在将来为您节省大量的工作,并从您的代码中获取那些讨厌的查询。
答案 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类以获取更多信息。
编辑:请注意,查询列名称应与对象
中的定义匹配