基本上你不能這樣做。 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);
謝謝,這是一個很棒的提示。聯繫對象有20個字段,有沒有辦法做到這一點,而沒有指定每個領域(或者當字段改變)? – Dean 2010-12-09 20:00:08