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 
} 

。,..但这似乎真的长篇大论。我如何将结果直接分配给当前实例?

+0

为什么要手动分配联系人的实例变量?联系L2SQL类吗?你能展示更多的代码吗? – madcapnmckay 2010-08-16 14:57:05

是否有一个原因,你不使它成为一个返回新联系人的静态方法?你想做这件事的方式看起来很糟糕(取决于你为什么这么做)。

我会建议你做它静态的,所以它可以用来像:

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(); 
} 

这正是Automapper构建要解决的问题。推荐的!

+0

+1对于汽车映射:) – Abel 2010-08-16 15:05:07

有没有办法做到这一点,因为LINQ是查询和取回结果,所以你将永远需要遍历列表或从列表中获取一个项目,并用它做你的事情。

+0

干杯的家伙,最简单和最干净的方式。很高兴在问题上获得第二双眼睛。 – Grover 2010-08-16 15:32:03

+0

您是如何解决问题的?问候 – 2010-08-16 16:36:35

+0

我总是与多层项目合作,所以我绝不会在后面的代码中编写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对象,作为输入或结果)。