LinQ to SQL查询数据库并分配给当前实例(this)
我在Contact类中有一个名为LoadContact()的公共方法。我想使用Linq加载联系人数据并将值分配给'this'实例。LinQ to SQL查询数据库并分配给当前实例(this)
到目前为止,我有.....
var contact = (from cont in db.Contacts
from note in db.Contacts_Notes.Where(n => n.ContactID == cont.ContactID).DefaultIfEmpty()
where cont.AccountID == this.AccountID && cont.ContactID == this.ContactID
select new Contact
{
AccountID = cont.AccountID,
CompanyName = cont.CompanyName,
ContactID = cont.ContactID,
Firstname = cont.Firstname,
JobTitle = cont.JobTitle,
Lastname = cont.Lastname,
Notes = note.Note
}).SingleOrDefault();
if(contact != null)
{
this.AccountID = contact.AccountID;
this.CompanyName = contact.CompanyName etc etc etc
}
。,..但这似乎真的长篇大论。我如何将结果直接分配给当前实例?
是否有一个原因,你不使它成为一个返回新联系人的静态方法?你想做这件事的方式看起来很糟糕(取决于你为什么这么做)。
我会建议你做它静态的,所以它可以用来像:
var contact = Contact.Load(...);
,而不是
var contact = new Contact();
contact.LoadContact(...);
这样,您就能够只返回您发现您的查询的接触像:
public static Load(int contactID, int accountID) //If they are integers
{
return (from cont in db.Contacts
from note in db.Contacts_Notes.Where(n => n.ContactID == cont.ContactID).DefaultIfEmpty()
where cont.AccountID == accountID && cont.ContactID == contactID
select new Contact
{
//... stuff
}).SingleOrDefault();
}
有没有办法做到这一点,因为LINQ是查询和取回结果,所以你将永远需要遍历列表或从列表中获取一个项目,并用它做你的事情。
干杯的家伙,最简单和最干净的方式。很高兴在问题上获得第二双眼睛。 – Grover 2010-08-16 15:32:03
您是如何解决问题的?问候 – 2010-08-16 16:36:35
我总是与多层项目合作,所以我绝不会在后面的代码中编写L2SQL语句,而只是将一个对象传递给GUI,然后像使用Databinding的例子一样设置属性(尤其是在WPF和Silverlight的)。 – 2010-08-17 06:48:12
只是一个想法:怎么样:
var contact = (from cont in db.Contacts
from note in db.Contacts_Notes.Where(n => n.ContactID == cont.ContactID).DefaultIfEmpty()
where cont.AccountID == this.AccountID && cont.ContactID == this.ContactID
select this.RenewSelf(
cont.AccountID,
cont.CompanyName,
cont.ContactID,
cont.Firstname,
cont.JobTitle,
cont.Lastname,
note.Note
).SingleOrDefault();
不是太漂亮,但是如果你实现私有方法RenewSelf
它至少更具可读性,不太“冗长”。还有其他选择,像其他人已经提出的那样,想像AutoMapper这样的东西。
PS:通常情况下,DAO层不是内置的里面的POCO,这是“代码味道”的标志。也就是说,也许你应该改变你的技术设计,使其成为一种更加强大的POCO和DAO分离的方法,在这种情况下,甚至不会再出现这个问题(即Load,Save等方法是DAO的一部分,一个POCO,这里是一个Contact
对象,作为输入或结果)。
为什么要手动分配联系人的实例变量?联系L2SQL类吗?你能展示更多的代码吗? – madcapnmckay 2010-08-16 14:57:05