3

뉴스 테이블이 있으며 주문 주문을 구현하고 싶습니다. 나는 newsIds와 위치를 가지고있는 위치 매핑 테이블을 통해 이것을 수행했다. Linq to Entities 위치 매핑 테이블을 통해 주문 주문

I는 다음 LEFT OUTER 위치 오름차순, 내림차순 articleDate 의해 선택한 경우 문

CASE WHEN [position] IS NULL THEN 9999 ELSE [position] END 

순서로 news.newsId position.itemId = ON 위치 조인 테이블.

이제 Linq와 동일한 작업을 수행하려고합니다. 내 뉴스 개체에 Entity Collection 포지션이 있도록 PK, FK 관계로 테이블을 설정했습니다.

이제는 제대로 작동하지 않습니다. LEFT OUTER JOIN을 구현하는 방법.

지금까지 가지고

var query = SelectMany (n => n.Positions, (n, s) => new { n, s }) 
        .OrderBy(x => x.s.position) 
        .ThenByDescending(x => x.n.articleDate) 
        .Select(x => x.n); 

이 좀 작동합니다. 그러나 이것은 INNER JOIN을 사용하여 이후의 작업이 아닙니다. 나는 오류를 DbSortClause 식을 얻을 그러나

ret = ret.OrderBy(n => n.Positions.Select(s => s.position)); 

순서 비교하는 유형이 있어야합니다 :

나는 다른 생각을했다.

는 또한

ret = ret.GroupJoin(tse.Positions, n => n.id, s => s.itemId, (n, s) => new { n, s }) 
        .OrderBy(x => x.s.Select(z => z.position)) 
        .ThenByDescending(x => x.n.articleDate) 
        .Select(x => x.n); 

을 시도하지만 난 같은 오류를 얻을!

누구든지 나를 도울 수 있다면, 대단히 감사하겠습니다!

UPDATE :
그래서이 작업을하려면 I에 대한 몇 가지 재생 관리 후.

ret = ret.GroupJoin(entity.Positions, n => n.id, s => s.itemId, (n, s) => new { n, s }) 
        .SelectMany(x => x.n.Positions.DefaultIfEmpty(), (n, s) => new { n, s }) 
        .OrderBy(x => x.s.position) 
        .ThenByDescending(x => x.n.n.articleDate) 
        .Select(x => x.n.n); 

그러나 이것은 여전히 ​​완전하지 않습니다. 나는 특정 positionid 또는 articleType 만 사용하는 방법이 없습니다. 나는 뉴스 ID 1 리뷰 아이디 있지만 위치 테이블에 정의 된 경우

, 현재 LINQ 쿼리가 모두 선택 것이다 (나는 생각한다)?

where 절을 사용하려고하면 기본적으로 내부 결합과 같습니다.

CASE WHEN [position] IS NULL OR shuffleId != 1 THEN 9999 ELSE [position] END 

나는 완전히이 작업을 수행하는 방법을 재고 할 수 있습니다 : 내가 필요한 것은 내가 바로 SQL에서하는 것처럼 시도하고 선택의 케이스를 사용하는 것입니다. 대체 방법에 대한 제안이있는 사람이 있습니까?

답변

2

방법에 대해 :

var query = 
    from n in news 
    let p = n.Positions.Select(p=>p.Position).FirstOrDefault() ?? 9999 
    orderby p, n.ArticleDate 
    select n; 

시. 위의 경우 각 뉴스에 대해 1 개의 포지션 항목 만 있다고 가정합니다 ... 그렇지 않은 경우 이상하게 보입니다.아래의 코멘트에 OP에 의해 게시


솔루션 :

ret = ret 
     .GroupJoin(tse.Positions, n => n.id, s => s.itemId, (n, s) => new { n, s }) 
     .SelectMany(x => x.s.DefaultIfEmpty(), (n, s) => new { n, s }) 
     .OrderBy(x => x.s.position == null || x.s.positionId != positionId ? 9999 : x.s.position) 
     .ThenByDescending(x => x.n.n.articleDate) 
     .Select(x => x.n.n); 
+0

감사합니다. 아직 완벽하지는 않지만 유용한 대답으로 답을 찾은 것 같습니다. –

+1

참조 용으로 마침내 해결 방법입니다! 여기가 약간 읽기 어려울 수 있으므로 복사/붙여 넣기는 친구입니다! : ret = ret.GroupJoin (tse.Positions, n => n.id, s => s.itemId, (n, s)) => new (n, s))> .SelectMany (x => xsDefaultIfEmpty())> new {n, s}) .OrderBy (x => xsposition == null || xspositionId! = positionId? 9999 : xsposition) .ThenByDescending (x => xnnarticleDate) .Select (x => xnn); –

1

은 내가 할 수있는 모든 당신을 제안하는 몇 가지 저장 프로 시저 방법을 사용하는 것입니다 - 새로운 Linq에 - 투 - SQL별로 솔루션에 추가 DataContext를 사용하여 결과를 가져옵니다. 이 경우 데이터베이스에 쿼리를 사용하지 않아도되며 이는 솔루션에 적합합니다.

이 절차의 결과 유형이 News 클래스와 호환되지 않을 수 있습니다. 하나의 표현을 다른 표현으로 변환하려면 코드를 작성해야 할 수도 있습니다.

필요한 경우 해결 방법에 대한 몇 가지 그림을 제공 할 수 있습니다.