2017-05-24 6 views
0

엔티티 프레임 워크를 통해 데이터베이스의 데이터를 쿼리하는 linq 식에 대해 왼쪽 외부 조인을 만들려고합니다. 이것은 linq 표현식입니다. 기본적으로 내가 뭘 하려는지 ProblemBehiclesTicket problemBehiclesTicket에서 문제를 테이블에 존재하는 경우보고, 존재하지 않는 경우, 나는 null/empty 문제 객체를 반환하고 싶습니다. 기본적으로 나는 그것이 외부 조인이라고 믿는다.Entity Framework + LINQ 외부 조인 오류 표현

var ticketsDetails = (from tickets in DbContext.tickets 
             join problemVehiclesTicket in DbContext.problem_vehicle on tickets.tickets_id equals problemVehiclesTicket.tickets_id 
             join problems in DbContext.problem on problemVehiclesTicket.problem_vehicle_id equals problem.problem_vehicle_id into problemGroup 
             from problems in problemGroup.DefaultIfEmpty(new problem { }) 
             where (tickets.tickets_id == ticketsId) 
             select new TicketsDetails 
             { 
              Ticket = tickets, 
              ProblemVehicle = problemVehiclesTicket, 
              Problems= problem, 
             }).ToList(); 

문제는 데이터베이스에 그 문제 테이블의 미러링하는 클래스입니다

`Problem` 
id (int), description (string), type (short) 

내가 가진 오류는 엔터티 또는 복합 형식 'SPOTS_Repository.speeding_offence은'에 LINQ에 건설 될 수 없다 "입니다 엔티티 쿼리. " 원본은 Entity Framework에서 가져온 것입니다.

모든 도움을 주시면 대단히 감사하겠습니다.

+1

가장 쉬운 (표준적인) 방법은'DefaultIfEmpty' 호출에서'새로운 문제 {}'를 제거하는 것입니다. 즉, 매개 변수없는 오버로드'DefaultIfEmpty()'를 사용합니다. 시합. –

답변

1

사례의 경우 problem은 매핑 된 엔터티입니다. 따라서 프로젝트에 투영 할 수 없습니다. 익명 형식 또는 다른 매핑되지 않은 클래스 (DTO)를 사용할 수 있습니다.

DefaultIfEmpty 메서드에서 매핑 된 엔터티 인 새 problem을 작성 중이므로 허용되지 않습니다.

수정

당신은 DefaultIfEmpty 방법에 아무것도 통과 할 필요가 없습니다. 실제로 전달할 수있는 것은 problem이며 매핑되어 있기 때문에 실제로 허용되지 않습니다. 따라서 새 problem을 만들지 않고 .DefaultIfEmpty()을 사용하십시오.

옵션 1 :

더 장황하게 여기

DefaultIfEmpty의 사용을 명확히 할 예입니다 DefaultIfEmpty() 아니오 매개 변수와 함께

var list1 = new List<int> { 1, 2, 3, 6, 4 }; 
var list2 = new List<int> { 4, 1, 2 }; 
var selection = 
    from l1 in list1 
    join l2 in list2 on l1 equals l2 into joined 
    from j in joined.DefaultIfEmpty() 
    select j; 

출력 : 1, 2, 0, 0, 4 왜? 3, 6 있기 때문에 발견하고 integer에 대한 DefaultIfEmpty은 0

옵션이 반환되지 않습니다 DefaultIfEmpty() 매개 변수와 우리는 항목이 발견되지 않는 경우 나타 내기 위해 할 수있는 몇 가지 경우에

을 조인, 대신 무엇을 반환합니다.

var list1 = new List<int> { 1, 2, 3, 6, 4 }; 
var list2 = new List<int> { 4, 1, 2 }; 
var selection = 
    from l1 in list1 
    join l2 in list2 on l1 equals l2 into joined 
    from j in joined.DefaultIfEmpty(99) //<-- see this 
    select j; 

출력 : 우리는이 같은 DefaultIfEmpty 방법 단일 매개 변수를 전송하여 해당 작업을 수행 할 수 있습니다 1, 2, 99, 99, 4 왜? 3과 6이 없기 때문에 DefaultIfEmpty99을 반환하도록 지시했습니다.

DefaultIfEmpty은 일반적인 방법입니다. 제 경우에는 이 int (s) 인 두 번째 목록에 참여하기 때문에 int이 필요합니다. 귀하의 경우에는 problem (s)이지만 매핑됩니다. 따라서 쿼리에서 구성 할 수 없습니다.여기

는 또 다른 예이다 :

var depts = new List<Department> 
{ 
    new Department { Name = "Accounting" }, 
    new Department { Name = "IT" }, 
    new Department { Name = "Marketing" } 
}; 
var persons = new List<Person> 
{ 
    new Person { DeptName = "Accounting", Name = "Bob" } 
}; 

var selection2 = 
    from d in depts 
    join p in persons on d.Name equals p.DeptName into joined2 
    // See here DefaultIfEmpty can be passed a Person 
    from j2 in joined2.DefaultIfEmpty(new Person { DeptName = "Unknown", Name = "Alien" }) 
    select j2; 

foreach(var thisJ in selection2) 
{ 
    Console.WriteLine("Dept: {0}, Name: {1}", thisJ.DeptName, thisJ.Name); 
} 

출력 : 클래스를 생성하고 가 당신을 도움이되기를 바랍니다 LINQ 쿼리에 그 사용을

Dept: Accounting, Name: Bob 
Dept: Unknown, Name: Alien 
Dept: Unknown, Name: Alien 

<== Fiddle Me ==>

+0

미안하지만, 당신이 여기서하려고하는 것을 얻지 못합니다. 익명 형식을 인스턴스화하려고합니까? – user1166085

+0

예 매핑 된 엔터티 클래스를 인스턴스화하는 대신 익명 형식을 사용하십시오. 자세한 내용은 [this] (https://stackoverflow.com/questions/25304665/linq-with-defaultifempty-with-select-new)를 참조하십시오. – CodingYoshi

+0

내 문제에 10 개의 변수가있는 경우 10 개가 필요합니다. – user1166085

0
Public class problem() 
{ 
public int id; 
public string description; 
public short type; 
} 

.DefaultIfEmpty(
    new problem() 
    { 
     Id = ticketsId, 
     Description = string.empty, 
    }); 

.

+0

그것은 위대한 괴짜 설명입니다. 정말 고맙습니다 – user1166085