2011-03-04 1 views
3

저는 이것을하기에 가장 좋은 방법을 찾고 있었고 지혜가 인정 될 것입니다. 읽기 전용 목적으로, 나는 행복하게 LINQ를 사용하고 그리드에 바인딩했습니다. 편집을 위해 LinqDataSource 컨트롤을 사용하고 프로세스에서 편집/삭제 작업을 활성화했으며 테이블의 일부 또는 전체 필드에 바인딩 된 멋진 편집 가능한 그리드가 있습니다.익명 LINQ 결과에 모눈을 바인딩 한 다음 DB에 변경 내용을 적용 하시겠습니까?

이제 테이블 A의 일부 필드를 편집하려는 상황이 있지만 해당 표에 표시 할 링크 된 테이블 B의 다양한 값이 있습니다 (편집 할 수 없음). 그래서 내 쿼리는 아래와 같습니다. tblDupes의 필드 (지워짐, 메모)는 내가 편집하고 싶은 것이지만 그 tblVoucher 것들을 표시하고 싶습니다.

var theDupes = from d in db.tblDupes 
          where d.dupeGroup == Ref 
          select new 
          { 
           Ref = d.dupeGroup, 
           InvoiceNum = d.tblVoucher.invoiceRef, 
           Value = d.tblVoucher.invoiceAmtDecimal, 
           VendorNum = d.tblVoucher.vendorID, 
           VendorName = d.tblVoucher.vendorName, 
           Cleared = d.Cleared 
           Notes = d.Notes 
          }; 

비슷한하지만 다른 질문 LINQDataSource - Query Multiple Tables?

그가 테이블에서 사용자 지정 쿼리와 LinqDataSource을 위해 다양한 이벤트를 처리 스콧 오클라호마의 블로그 항목 http://weblogs.asp.net/scottgu/archive/2007/09/07/linq-to-sql-part-9-using-a-custom-linq-expression-with-the-lt-asp-linqdatasource-gt-control.aspx,보고 나를 보내신. 이것은 클래스가 명시 적으로 필드의 서브 세트를 가지고 있더라도 명시 적으로 디자인 된 클래스를 목표로하는 것 같습니다.

그럼 내 질문에 : 익명 컬렉션 (changes.Submit 형식 작업)에 대한 변경 사항을 커밋 할 수있는 쉬운 방법이 있거나 다른 테이블의 필드를 포함하지 않고 '표시'하는 쉬운 방법이 있습니까? 업데이트 중입니까?

편집 : 더 생각하면 은 익명으로이됩니다. 자주 변경되지 않으므로 해당 쿼리의 요소를 포함하도록 클래스를 정의하게되어 기쁩니다. 그러나 이러한 요소는 업데이트가 필요한 경우에도 두 테이블에 걸쳐 있습니다. 그것이 엔티티 프레임 워크가 더 적합 할 것이라는 것을 확신 할 수 있을지 확신하지 못한다. 필자는 그렇지 않을 것 같은 느낌을 받는다. 필자는 전체 '모델'이 항상이 방법으로 필드를 그룹화하기를 원하지 않는다.

감사합니다.

답변

0

여기에 야생의 추측을하고 있지만 LINQDataSource.Updating 이벤트를 듣고 거기에서 저장을 수행 할 수 없습니까? 물론 LinqDataSourceUpdateEventArgs.OriginalObjectobject을 입력 할 수 없기 때문에 매핑에 문제가 있습니다.

익명 형식 대신 ViewModel을 만들면 어떻겠습니까? DupeVoucherViewModel과 같은 것입니다.

그런 다음 Updating 경우에, 당신은 DupeVoucherViewModel 객체에 LinqDataSourceUpdateEventArgs.OriginalObject 캐스트 및 매핑 및 데이터 저장을 시작할 수 있습니다.

예 당신은 당신과 같이 그에게 DupeVoucherViewModel를 호출하고 바인딩 (클래스) 뷰 모델을 만들 점을 감안

:

var theDupes = from d in db.tblDupes 
         where d.dupeGroup == Ref 
         select new DupeVoucherViewModel 
         { 
          Ref = d.dupeGroup, 
          InvoiceNum = d.tblVoucher.invoiceRef, 
          Value = d.tblVoucher.invoiceAmtDecimal, 
          VendorNum = d.tblVoucher.vendorID, 
          VendorName = d.tblVoucher.vendorName, 
          Cleared = d.Cleared 
          Notes = d.Notes 
         }; 

그런 다음 서버 태그 같은 업데이트 이벤트를 매핑해야 그래서 :

<asp:LinqDataSource EnableUpdate="true" OnUpdating="LinqDataSource_Updating" /> 

그리고 코드 뒤에는 다음과 같은 방법이 포함되어야합니다 :

protected void LinqDataSource_Updating(object sender, LinqDataSourceUpdateEventArgs e) 
{ 
    // originalObject contains the unchanged object 
    var originalObject = (DupeVoucherViewModel)e.OriginalObject; 
    // newObject contains the changed object 
    var newObject = (DupeVoucherViewModel)e.NewObject; 

    // Perform your save using newObject 
    yourDataAccessComponent.SaveSomething(newObject); 
} 
당신이를로드하고 변경할 수 있도록이 같은 tblDupes 또는 무언가의 ID로 DupeVoucherViewModel에서 좀 더 많은 정보를 포함해야 할 수도 있습니다

.

당신은 여기 LinqDataSource에 대한 자세한 내용을보실 수 있습니다 : 그것에 대해 http://msdn.microsoft.com/en-us/library/bb514963.aspx

+0

감사합니다. 이런! 이제 당신의 대답을보고 더 많이 생각해 봅시다, 익명으로 할 필요는 없다고 생각합니다. 양쪽 모두의 내용을 가진 유형을 정의 할 수있을 것 같습니다. 그 생각을 질문에 추가 할 수 있습니다! – Glinkot

+0

안녕 마이크, 나는 당신이 언급 한 것을 정리하기 위해 청구서를 지불 할 능력이 없지만 곧 다른 제안을 듣지 않았다면 이것을 답변으로 표시 할 것입니다! :) – Glinkot

관련 문제