2010-12-09 64 views
0

我想選擇使用LINQ SQL另一個對象的值的對象,LINQ:選擇一個對象,但改變一些屬性,而無需創建新對象

我現在有這個,

var result1 = (from s in pdc.ScanLogs 
        from ec in pdc.ExhibitsContacts 
        where s.ExhibitID == ec.ExhibitID 
      select ec.Contact); 

我想指定一個值ec.Contact.Note = ec.Comment; 是否有一種方法可以在LINQ SQL中執行此操作而無需編寫多個查詢?

我看過這篇博客文章:http://blog.robvolk.com/2009/05/linq-select-object-but-change-some.html,但它似乎不適用於LINQ SQL。

回答

0

問題是,LINQ to SQL不知道如何解釋你的擴展方法。除了使用從LINQ到SQL的存儲過程(哪種類型的失敗)之外,唯一的方法是獲取對象,更新並提交更改。

1

基本上你不能這樣做。 LINQ是一種查詢語言,你想要做的是用你的查詢改變現有的實體。這意味着您的查詢會產生副作用,而這不是LINQ to SQL所支持的。

儘管在將LINQ to SQL實體返回時,這在單個查詢中不起作用,但返回簡單的DTO結構時將起什麼作用。例如:

var result1 = 
    from s in pdc.ScanLogs 
    from ec in s.ExhibitsContacts 
    select new ContactDto 
    { 
     Id = ec.Contact.Id, 
     Note = ec.Comment, 
     SomeOtherFields = ec.Contact.SomeOtherFields 
    }; 

補充說明:還看我如何刪除where s.ExhibitID == ec.ExhibitID從查詢中加入,只要使用該ScanLog實體ExhibitsContacts財產(將由LINQ生成到SQL支持你您的數據庫模式具有定義的正確外鍵)。


更新:

當你需要從幾個方法返回的DTO,你可能會考慮從實體的集合改造集中到DTO對象的集合。我傾向於將這種方法放在DTO上(這使得它很容易找到)。代碼可能是這樣的:

public class ContactDto 
{ 
    // Many public properties here 

    public static IQueryable<ContactDto> ToDto(
     IQueryable<Contact> contacts) 
    { 
     return 
      from contact in contacts 
      select new ContactDto 
      { 
       Id = contact.Id, 
       Note = contact.ExhibitsContact.Comment, 
       ManyOtherFields = contact.ManyOtherFields 
      }; 
    } 
} 

這種靜態變換方法的訣竅是,它需要一個IQueryable並返回一個IQueryable。這允許簡單地指定轉換並讓LINQ to SQL(或任何其他啓用LINQ的O/RM)稍後有效地執行該LINQ表達式。原始代碼現在看起來像這樣:

IQueryable<Contact> contacts = 
    from s in pdc.ScanLogs 
    from ec in s.ExhibitsContacts 
    select ec.Contact; 

IQuerable<ContactDto> result1 = ContactDto.ToDto(contacts); 
+0

謝謝,這是一個很棒的提示。聯繫對象有20個字段,有沒有辦法做到這一點,而沒有指定每個領域(或者當字段改變)? – Dean 2010-12-09 20:00:08

相關問題