所以我有一个带有[Raw_Data]
和[Names]
表的sqlite数据库。 Raw_Data有3个字段,用于保存名称表(requester, worker, and approver).
的引用(外键?)
当我显示数据时( dgvResults是Windows窗体应用程序中的DataGridView ),我想将名称合并到主表(Raw_Data)
中。
我正在使用sqlite-net(通过guitub上的praeclarum)并拥有此代码(仅为了简洁而显示相关部分):
...
using (var db=new SQLiteConnection(DB_Interop_SQLite.DB_Path, true))
{
this.Users=db.Table<User>().ToList<User>();
this.Records=db.Table<Raw_Data>().ToList<Raw_Data>();
this.Roles=db.Table<Role>().ToList<Role>();
}
var items=
(
from r in this.Records
join requester in this.Users on r.Requester equals requester.ID into group1
from requester in group1.DefaultIfEmpty()
join worker in this.Users on r.Drafter equals worker.ID into group2
from worker in group2.DefaultIfEmpty()
join approver in this.Users on r.Approver equals approver.ID into group3
from approver in group3.DefaultIfEmpty()
select new {
r.ID, r.Project, Requester=requester, r.Task_Code,
r.DT_submitted, r.DT_required, // other fields
Worker=worker, r.DT_completed, // other related fields
Approver=approver, r.DT_approved, // more fields
}
).ToList();
this.dgvResults.DataSource=items;
...
我已阅读LINQ Join 2 List<T>s和Create Items from 3 collections using Linq以及Merge multiple Lists into one List with LINQ
他们提供了很大的帮助。
我还提到A generic list of anonymous class,它真正帮助我创建了linq查询,它一切都很好用。 在我的代码中,User类覆盖了ToString()方法,因此它显示了我想要的全名。
假设我想要一个包含Raw_Data字段的List,但是不是引用Names中ID的整数字段,而是将User对象作为一个字段,它将保存ID以及用户的其余部分信息(姓名,电子邮件,电话等),就像我在select语句中的匿名类型一样。
所以我的问题是:有没有更好的方法来实现一个列表(不是匿名类型),而不是重写整个Raw_Data类只是为了拥有一个“用户”字段(来自Names表)而不仅仅是用户ID?
理想情况下,我想要与我的代码完全相同的行为,但最好不要使用匿名类型。
感谢。
答案 0 :(得分:1)
不确定这是否是您正在寻找的,但您可以指定一个类来保存该数据,然后选择进入而不是匿名类型:
public class RawDataInfo
{
public int ID { get; set; }
public string Requester { get; set; }
...
}
然后改变你的选择RawDataInfo()
select new RawDataInfo(){
ID = r.ID,
Requester = requester,
...
}
答案 1 :(得分:1)
您可能希望查看AutoMapper之类的内容。这是一个库,允许您轻松一致地从一种类型的对象映射到另一种类型的对象。它干净且经过充分测试。