2016-12-12 1 views
0

SQL 서버 union에서 결과는 기본 키 열을 기준으로 정렬됩니다. 엔티티 프레임 워크에서이 동작을 방지하고 싶습니다.
this post에서 @praveen은 pure SQL에서이 작업을 수행하는 방법을 설명했습니다. 하지만 엔티티 프레임 워크에서이 작업을 수행하려고합니다.
내 코드 :엔터티 프레임 워크에서 유니온 정렬 결과 방지

public virtual ActionResult Search(string keyword) 
{ 
    var products = _db.Products 
     .Where(x => x.IsActive) 
     .AsQueryable(); 

    var productExactlyTitle = products.Where(x => x.Title == keyword); 
    var productStartTitle = products.Where(x => x.Title.StartsWith(keyword)); 
    var productContainsTitle = products.Where(x => x.Title.Contains(keyword) 
                || x.Title.Contains(keyword) 
                || x.SubTitle.Contains(keyword) 
                || x.OtherName.Contains(keyword)); 


    var productList = productExactlyTitle.Union(productStartTitle) 
     .Union(productContainsTitle) 
     .Take(10) 
     .AsEnumerable() 
     .Select(x => new ProductItemViewModel() 
     { 
      Id = x.Id, 
      Title = x.Title, 
      Price = x.Price.ToPrice(), 
      Image = x.Images.FirstOrDefault(y => y.IsCoverPhoto)?.ImageUrl 
     }); 

     // some code ...   
} 

나는 순서 아래에있는 레코드를 표시하려면 :

첫째 : 의 기록 productExactlyTitle
둘째 : 의 기록 productStartTitle을
셋째 : 의 기록 productContainsTitle

결과는 Id 열로 정렬됩니다! 나는 이것을 원하지 않는다.

방법이 있나요?

+0

당신은 우리에게 당신이 시도, 그렇지 않으면 우리가 도울 수있는 코드를 표시해야합니다. https://stackoverflow.com/help/how-to-ask –

답변

1

명시 적으로 설정된가없는 모든 쿼리는 순서가없는 것으로 간주됩니다. (그리고 EF는 SQL로 번역 된 쿼리). 그래서 당신이 노조 후에 특별한 주문을 원한다면 그것을 지정하십시오. 특정 사례를 들어

var result = q1.Union(q2).OrderBy(x => x.?); 

는 :

var p1 = productExactlyTitle.Select(x => new { Item = x, Order = 1 }); 
var p2 = productStartTitle.Select(x => new { Item = x, Order = 2 }); 
var p3 = productContainsTitle.Select(x => new { Item = x, Order = 3 }); 
var productList = p1.Union(p2) 
        .Union(p3) 
        .OrderBy(x => x.Order) 
        .Select(x => x.Item) 
        .Take(10); 
+0

내 코드를 참조하십시오. 프로젝트를 실행할 때 레코드는'Id' 칼럼을 기반으로 정렬됩니다. –

+0

@MajidBasirati 추가 한 코드에 대한 답변을 업데이트했습니다. – Magnus

+0

이것은 내가 원하는 것입니다. 고맙습니다. –

관련 문제