2014-03-12 3 views
0

LINQ를 통해 레코드 집합을 검색 한 후 Include 문의 체인을 사용하여 Where를 찾습니다. 이러한 레코드는 Solicitud de AccionN 테이블 (보기로 전달) 테이블에 저장됩니다. 여기에는 분석 테이블의 원인이 세 가지가 있습니다. 원인 분석, 계획 수락 & Evaluacion Efectividad.관련 데이터를 읽을 수 없습니다. LINQ

Where 문은 현재 로그인 한 사용자의 UserId (ResponsableId)를 묻습니다. UserId가 책임지고있는 모든 Solicitud de Accion 레코드를 요청하고 있습니다. 케이크 조각은 UserId가 테이블의 필드이기 때문에 내가하는 모든 일은 그것을 요구하는 것입니다. 무엇보다도, 다른 세 테이블 - 원인 분석, 계획 수락 & Evaluacion Efectividad - 동일한 필드 UserId (ResponsableId)가 있습니다.

나의 현재 LINQ의 식입니다 : 이제

var sacSolicitudAccion = 
    db.SacSolicitudAccion.Include(s => s.SacResponsables) 
         .Include(s => s.SacAnalisisCausal) 
         .Include(s => s.SacPlanesAccion) 
         .Include(s => s.SacEvalEfectividad) 
         .Where(s => s.SacResponsablesID == idUsuario); 

진짜 문제. 나는 현재 로그인 한 사용자가 책임지고있는 모든 Solicitud de Accion과 사용자가 분석 원인, 계획 기획안 또는 평가판을 책임지고있는 모든 Solicitud de Accion을 보여줄 필요가 있습니다.

어떻게하면됩니까?

* 중요

  • Solicitud 드 ACCION 많은 Analisis 인과 Analisis 인과 관계를 가지고 하나 Solicitud 드 ACCION 있음) 및 ResponsableId (사용자 아이디) 필드는 : Solicitud 드 ACCION 다른 세 개의 테이블이 관계를 갖는다 모든 테이블에서 동일하므로 모든 테이블에서 동일합니다.

답변

0

마지막으로 해결했습니다. 하지만 전체 구조를 ViewModel 방식으로 재 설계해야했습니다. 나는 긴 길을 가져 와서 같은 이름의 SacSolicitudesAccion이라는 세 가지 컬렉션을 만들었지 만 다른 이름을 사용했다. (VM의에서) 이런 식으로 뭔가 :

public ICollection<SacSolicitudAccion> OverdueRequest { get; set; } 
public ICollection<SacSolicitudAccion> OverdueRequestByActionPlan { get; set; } 
public ICollection<SacSolicitudAccion> OverdueRequestByEfectiveness { get; set; } 

내가 모든 기록을 보유하고 AsQueryable 변수를 설정, 당신은의 일부 성능에 문제를 가져올 수 있지만 LINQ의 힘이 프레임 워크를 과소 평가하지 않는 것이 생각 것은 매우 빠릅니다.

나는 SacSolicitudAccion, SacPlanesAccion & SacEvaluacion을 해당 변수에 넣어서 기한이 지난 것인지 확인하고 SacSolicitudAccion을 선택하여 해당 ViewModel 문에 바인딩합니다. 뷰에 ViewModel을 전달하려면 뷰의 일부 변경이 필요했지만 foreach (Model의 var 항목) 대신 foreach (Model.Entity의 var 항목)가 필요합니다. 그처럼 간단합니다.

그런 까다로운 부분은 필터를 관리하고 다시 작성했지만 다른 이야기입니다.

답장을 보내 주셔서 감사합니다. 인사말!

-1
.Where(s => s.SacResponsablesID == idusuario || 
      s.SacPlanesAccion.SacResponsablesID == idusuario || 
      s.SacEvalEffectividad.SacResponsablesID == iduario); 

는 당신이 필요로 무엇을 얻을 수 귀하의 Where 절을 대체합니다. 응용 프로그램 코드가이 코드를 사용하지 않고 위 코드를 SQL로 변환하면 데이터 포인트를 가져올 필요가 없으므로 포함되어있는 코드가 모두 필요하지는 않을 수도 있습니다.

+0

쿼리 결과를 처리 할 때 포함 된 정보를 사용하지 않는다는 것을 어떻게 알 수 있습니까? 그는 쿼리의 결과로 그가하고있는 것을 보여주지 못했습니다. 또한 'Where'는 OP와 다르지 않습니다.EF가 관계를 처리하는 방법에 대한 전체적인 생각은 참조 된 컬렉션에는 기본 항목이 주어진 항목과 일치하는 항목 만 포함된다는 것입니다. – Servy

+0

@Servy : 명시 적으로 "응용 프로그램 코드가이 코드를 사용하지 않고 위 코드가 SQL로 변환 된 경우"라고 말했습니다. 솔직히 이름을 지어 내게 던져 버렸고 기본 키를 추적하는 데 어려움을 겪었습니다. 어떤 방식 으로든 비 기본 관계가 있다고 가정했습니다. – Guvante

+0

실제로보기에서 관련된 데이터를 표시해야하기 때문에 포함이 중요합니다. 이 솔루션은 내가 속성 (예 : SacPlanesAccion.)을 탐색 할 때 좋아 보이지만 SacResponsablesID를 표시하지 않으며 count, concat, aggregate 등과 같은 메소드 만 표시합니다. 성명을 선언 할 방법이 있다면 생각하고 있습니다. 그런 다음 더 많은 행/레코드를 "추가"하십시오. 그게 가능하니? 그것에 대한 방법이 있습니까? 내 모델이나 컨텍스트 클래스에서 뭔가 추가가 필요합니까? 그렇다면 내가 제안한 것과 같은 속성을 탐색 할 수 있습니까? 답변 해 주셔서 감사합니다. –

관련 문제