2016-12-12 4 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 ...   
} 

私がオーダー以下のレコードを表示する:

まず:の記録productStartTitle
サード:の記録productExactlyTitle
第二の記録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

これは私が欲しいものです。ありがとうございました。 –

関連する問題