2017-09-26 8 views
1

IQueryableを個別の値と順序付けした値を取得しようとしましたが、orderbyの後に別名を適用できない場合、または注文を失うことになります。私は結果を繰り返します。これにより別個のレコードを持つIQueryableと注文しました

IQueryable<gbd_Pages> Listpagespages = 
     (from c in _db.gbd_Content 
     where c.IsActive == true && c.IsDeleted == false && 
      c.gbd_Template_Fields.SortOrder == sortOrder 
     orderby c.Content ascending 
     select c.gbd_Pages); 

私が試した最後のクエリは、以下の通りでした。

返されるテーブルは、と1対多の関係を持つgbd_Pagesです。 これは、gbd_Contentには、主キーがgbd_Pagesになるような外部キーがあることを意味します。

gbd_Template_FieldsテーブルのsortOrderは、1対1の関係を持ち、gbd_Contentとする必要があります。

これを行う方法はありますか?私はIQueryableで、IEnumerableまたはリストに変換する必要はありません。

+1

あなたが 'gbp_Pages'を探しているなら、それはあなたのプライマリ' from'である必要があります。そこから、 '.Any()'を 'gbd_Content'に対してクエリで使うことができ、Distinctを行う必要はありません。 – DiskJunky

+0

@DiskJunkyあなたが私に例を教えてくれますか?最後に、私はsortOrderをc.gbd_Template_Fields.SortOrderで行う必要があります – Nmaster88

+0

1から多くの関係がある場合、どのように多くのフィールドで1を注文するのですか?それは 'Min'のようにいくつかの集計でなければなりませんか? –

答えて

2

はこのようなものです:

var query = 
    from p in _db.gbd_Pages 
    from pc in (from c in p.gbd_Content 
       where c.IsActive == true && c.IsDeleted == false && 
        c.gbd_Template_Fields.SortOrder == sortOrder 
       orderby c.Content ascending 
       select c).Take(1) 
    orderby pc.Content ascending 
    select p; 

ですから、Distinctの必要性を回避するために、(関係のone側からスタート)、many側からの単一のレコードを選択し、条件に一致し、smソートフィールドのaller値(orderedサブクエリ+ Take(1)を使用)を返し、最後にその単一の子レコードのソートフィールド値を使用して結果をソートします。

gbd_Pagesからgbd_Contentに逆コレクションのナビゲーションプロパティがあるとします。そうでない場合は、p.gbd_Content_db.gbd_Content where c.[gbd_Content_FK] == p.[PK]に置き換えてください。

+0

これは正しい解決策です。私は最初にいくつかのテストを行う必要があり、私はこれを正しい解決策としてマークすることができます。ありがとう – Nmaster88

1

プライマリfromは、返す結果がgbp_Contentではなくgbd_Pagesテーブルである必要があります。私はここで外来キーを仮定する必要がありますが、あなたは何かに変更したいと思います。

IQueryable<gbd_Pages> Listpagespages = _db.gbp_Pages 
              .Where(p => (from c in _db.gbd_Content 
                     where c.IsActive == true 
                      && c.IsDeleted == false 
                     select c.gbd_Pages.PrimaryKeyID) 
                     .Any()) 
              .Select(p => new 
                { 
                 // select specific fields here... 
                 p, 
                 SortCol = _db.gbp_Content 
                    .FirstOrDefault(c => c.PrimaryKeyID) 
                    .Where(c => c.IsActive == true && c.IsDeleted == false && 
                      c.gbd_Template_Fields.SortOrder == sortOrder) 
                    .Select(c => c.Content) 
                }) 
              .OrderBy(v => c.SortCol); 
+0

答えをありがとう。はい、 'gbd_Content'には' gbd_Pages'からの外部キーがありますが、どうすればgbd_Contentテーブルの特定のsortorderを持つcontentプロパティでorderbyを実行できますか? – Nmaster88

+0

それは私にエラーを与えています。選択:\t 'bool'に 'Select'の定義がなく、 'bool'タイプの最初の引数を受け入れる拡張メソッド 'Select'が見つかりませんでしたアセンブリ参照? – Nmaster88

+0

@ Nmaster88更新されたクエリ。スキーマ/コードなしで実行するのはちょっと難しいですが、調整はうまくいくはずです – DiskJunky

-2

これを試してみてください:私はあなたが必要なものと考えてい

  IQueryable<gbd_Pages> Listpagespages = _db.gbd_Content 
               .Select (c=>new { c.gbd_Pages }) 
               .Where(c=>c.IsActive == true && c.IsDeleted == false &&c.gbd_Template_Fields.SortOrder == sortOrder) 
               .Distinct() 
               .OrderBy(c => c.Content) 
               .Select(c => c.gbd_Pages) 
+0

このアプローチは、Distinct()が必要でないという点で問題があります。一般的には、distinctを使用することは、セット理論の観点からコードの匂いです。これは、あまりにも多くのデータから始めるか、またはプライマリとして正しいセットを選択していないことを意味します。 – DiskJunky

+0

既にこれを試してもうまくいかず、重複したレコードを与えることがあります – Nmaster88

関連する問題