2010-12-09 5 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 
    }; 

: 예를 들어도 그냥 때를 위해 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); 
+0

감사합니다. 유용한 팁입니다. Contact 객체에는 20 개의 필드가 있습니다. 모든 필드를 지정하지 않고 (또는 필드가 변경 될 때)이 작업을 수행 할 수있는 방법이 있습니까? – Dean

+1

AutoMapper와 같은 도구를 사용하면 엔티티의 속성을 DTO에 자동으로 복사 할 수 있지만 인 메모리 개체에서만 작동합니다. LINQ to SQL에서 효율적인 SQL 쿼리를 만들도록하고 (필요로하는 것보다 더 많은 데이터를로드하지 않으려는 경우)이 방법은 작동하지 않습니다. 엔티티에서 DTO 로의 변환을 중앙 집중화하는 것이 도움이 될 수 있습니다. 나는이 예를 보여주기 위해 나의 대답을 업데이트했다. 나는 그것이 어떤 도움이되기를 바랍니다. – Steven

+0

AutoMapper를 언급하는 +1 – CGK

관련 문제