2014-09-25 1 views
0

모두 좋은 날, ASP.NET, Entity Framework 등의 초보자. 직선 프로그래밍에 정통하므로 새로운 방법으로 넘어 가기 전에 먼저 오래된 방법을 잊어 버려야합니다.특정 하위 요소 만 반환하도록 엔터티 프레임 워크 컨텍스트 필터링

FLEET 항목 (부모)과 그 모든 FLEETEVENT 항목 (자녀). 두 개는 FleetId 필드를 통해 연결됩니다.

다음을 사용할 수 있습니다 : Fleet fleet = db.Fleets.Find(id); 그리고 id 변수와 일치하는 상위 레코드와 모든 하위 요소를 반환합니다.

내가 뭘하려고 만 자식 요소를 반환하는 경우 FLEETEVENT.STATUS == 진정한

내가 LINQ 식을 DataLoadOptions.AssosiateWith를 사용하여 시도했다, 그러나 나는 AssociateWith 및 변환 오류가 모든 레코드를 얻을 수 LINQ 식을 사용하려고합니다.

나는이 일을하기가 너무 어려워서는 안된다고 생각하지만, 나는 낡은 사고 방식에 빠져있다.

커넥터 모델 :

public class FleetContext : DbContext 
{ 
    public FleetContext() : base("DefaultConnection") 
    { 
    } 

    public DbSet<Fleet> Fleets { get; set; } 
    public DbSet<FleetEvent> FleetEvents { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new FleetConfiguration()); 
     modelBuilder.Configurations.Add(new FleetEventConfiguration()); 
    } 
} 

상위 모델 :

public class Fleet : IObjectWithState 
{ 
    public Fleet() 
    { 
     FleetEvents = new List<FleetEvent>(); 
     Status = true; 
    } 

    public System.Guid FleetId { get; set; } 
    public string FleetType { get; set; } 
    public string FleetNum { get; set; } 
    public string FleetMake { get; set; } 
    public string FleetModel { get; set; } 
    public int FleetYear { get; set; } 

    public bool Status { get; set; } 
    public byte[] RowVersion { get; set; } 

    public ObjectState ObjectState { get; set; } 

    public virtual List<FleetEvent> FleetEvents { get; set; } 
} 

아이 모델 : LINQ를 사용

public class FleetEvent : IObjectWithState 
{ 
    public System.Guid FleetEventId { get; set; } 
    public DateTime FleetEventDate { get; set; } 
    public string FleetEventType { get; set; } 
    public string FleetEventDesc { get; set; } 

    public bool Status { get; set; } 
    public byte[] RowVersion { get; set; } 

    public System.Guid FleetId { get; set; } 
    public Fleet Fleet { get; set; } 

    public ObjectState ObjectState { get; set; } 
} 

, 이것은이다 다음과 같이

코드 snipets은 내 공동의 코드 사용중인 컨트롤러 :

var result = from f in db.Fleets 
        join fe in db.FleetEvents 
         on f.FleetId equals fe.FleetId 
        where ((f.FleetId == id) && (fe.Status == true)) 
        select new { f, fe }; 

     Fleet fleet = result.ToList(); 

LinqPad를 통해 LINQ 구문이 올바르다는 것을 확인했으며 예상 한 결과를 반환했습니다. 그러나 코드에서 사용하면 Fleet 함대 코드에서 변환 오류가 발생합니다.

올바른 방향으로 나를 알려줄 수있는 정보는 크게 감사하겠습니다.

+1

구체적 오류 메시지를 제공해주십시오. –

답변

0

귀하의 문제는 함대가 클래스가 아니라리스트 <>()입니다. 따라서 ToList()를 호출하면 실패합니다. 또한 f를 선택하면 fle은 함대가 아닙니다.

select new MyClass() 
{ 
     MyField = f.Field, 
     MyThingy = fe.thingy 
} 

가 대신 수행 할 수 있습니다 무엇이 같은 것입니다 :

Fleet fleet = new Fleet() 
{ 
     FleetId = results.FleetId, 
     FleetEventDate = results.FleetEventDate, 
     ... 
} 

가장 어려운 부분은 내부의 목록을 채우는됩니다 :)이 비슷한 특별히하고자하는 클래스를 선택하려면 목적. 그러나 fe 인스턴스를 통해 열거 할 수 있으며 FleetEvents 목록에 각 인스턴스를 추가 할 수 있습니다.

2

우선 Entity 프레임 워크에서 탐색 속성을 사용하여 쿼리하는 방법을 배우고 조인을 피해야합니다.여기

// return all FleetEvents where FleetEvent.Status = true for fleetID = n... 
var result = db.FleetEvents 
       .Where(x=> x.Status == true && x.FleetID = id) 
       .Select(x=> new { 
         Fleet = x.Fleet, 
         FleetEvent = x 
        }); 

// however result is of anonymous type, so you get Fleet and 
// FleetEvent both as properties of result 

당신이 자식 가진 상태로 모든 함대를 반환 할 경우

= 사실
var fleets = db.Fleets 
       .Where(x=> x.FleetID == id && 
          x.FleetEvents.Any(f=> f.Status == true)); 

// fleets is now and enumerable with all fleets with atleast 
// one child having Status=true 

모든 아이들이 상태를 갖는 모든 함대를 반환 할 경우

= 샘플입니다 true

var fleets = db.Fleets 
       .Where(x=> x.FleetID == id) 
       .Select(x=> new { 
        Fleet = x, 
        FleetEvents = x.FleetEvents.Where(f=> f.Status == true) 
       }); 

// here you have once again Anonymous type with Fleet and all FleetEvents 
// with Status = true 
+0

Akash, 감사합니다. 몇 가지 추가 조사를 한 후에이 코드와 매우 비슷한 코드를 실행했습니다. 내가 실패했다면 익명의 타입을 클래스 타입으로 다시 캐스팅하는 것이었다. .Include (FE => 철 (=> f.FleetId == ID F) 함대 함대 = db.Fleets 어디에요 : 그러나 나는 다음과 같은 작품이 실제 함대 클래스로 항목을 끌어 것을 찾았어요 .FleetEvents) . 싱글(); 그러나 분 전으로 .Include 라인을 변경하려고 : .Include (FE => fe.FleetEvents.Where (FE => fe.Status)) 나는 다음과 같은 오류 얻을 –

+0

: 는 경로 식을 포함을 유형에 정의 된 탐색 속성을 참조해야합니다. 참조 탐색 속성 및 콜렉션 탐색 속성의 선택 연산자에 점선으로 된 경로를 사용하십시오. 매개 변수 이름 : 경로 나는 이것이 어렵다고 생각하지 않았다. = \ –

+0

익명 형식을 클래스 형식으로 캐스트 할 수 없으면 Select를 사용하고 전체 개체를 속성 중 하나로 가져와야합니다. 포함 경로에 표현식을 넣을 수 없습니다. 당신이 원하는 것은 마지막 질의입니다. Fleet과 FleetEvents를 모두 얻을 수 있습니다. 그러나 익명 객체로, Fleet 및 FleetEvents 속성을 사용하여 액세스 할 수 있습니다. –

관련 문제