기본적으로이 작업을 수행 할 수 없습니다. 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
};
: 예를 들어도 그냥 때를 위해 SQL로 LINQ에 의해 생성 될 ScanLog
기업의 ExhibitsContacts
속성을 (사용하여 쿼리에서 조인 나는 where s.ExhibitID == ec.ExhibitID
을 제거하는 방법을 살펴 데이터베이스 스키마에 적절한 외부 키가 정의되어 있음).
업데이트 : 당신은 여러 가지 방법에서 그 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);
감사합니다. 유용한 팁입니다. Contact 객체에는 20 개의 필드가 있습니다. 모든 필드를 지정하지 않고 (또는 필드가 변경 될 때)이 작업을 수행 할 수있는 방법이 있습니까? – Dean
AutoMapper와 같은 도구를 사용하면 엔티티의 속성을 DTO에 자동으로 복사 할 수 있지만 인 메모리 개체에서만 작동합니다. LINQ to SQL에서 효율적인 SQL 쿼리를 만들도록하고 (필요로하는 것보다 더 많은 데이터를로드하지 않으려는 경우)이 방법은 작동하지 않습니다. 엔티티에서 DTO 로의 변환을 중앙 집중화하는 것이 도움이 될 수 있습니다. 나는이 예를 보여주기 위해 나의 대답을 업데이트했다. 나는 그것이 어떤 도움이되기를 바랍니다. – Steven
AutoMapper를 언급하는 +1 – CGK