0

エンティティ フレームワークのデータベース コンテキストから新しいデータを jTable に返そうとしています。このデータを並べ替えたいのですが、うまくいきません。変数をlinqクエリのorderbyステートメントに渡していますが、何をしてもソートされません。その文字列の値を入力すると機能するので、文字列変数をlinqクエリに追加できるかどうか疑問に思っていますか? ここで私が見た他のことから、それは一般的な問題のようです。

私はVS 2010、.net 4.0、MVC 3を使用しています。すでに追加してDynamic Linqを機能させようとし、System.Data.Entityを使用して追加しました。

 [HttpPost]
    public JsonResult WineList(string jtSorting = null, int ProducerID = 0)
    {
        try
        {


            jtSorting = "wine." + jtSorting.Replace("ASC", "ascending").Replace("DESC", "descending");


            List<Wine> wines = db.Wines.Where(w => w.Active == true).Where(w => w.ProducerID == ProducerID).ToList(); 

            //have to do this so we don't get circular references between producers and wines


            var q = (from w in wines
                    let wine = new
                    {
                        WineID = w.WineID,
                        Producer = w.Producer.Name,
                        VarType = w.VarType.Name,
                        Vintage = w.Vintage.Name,
                        Name = w.ShortName,
                        App = w.App.Name
                    }
                    orderby(jtSorting)
                    select wine);

            //var x = from w in q
            //        orderby jtSorting
            //        select w;



            return Json(new { Result = "OK", Records = q });

        }
        catch (Exception ex)
        {

            return Json(new { Result = "ERROR", Message = ex.Message });
        }

    }

誰かが jtable を処理するより良い方法を持っている場合は、私もそれを受け入れます! ありがとう

4

3 に答える 3

1

フィールドと順序を渡す動的ソートが必要ですか?

IEnumerable<T> での動的 LINQ OrderBy

于 2012-05-10T17:00:10.433 に答える
1

1:次のように、順序を示す文字列を渡すよりもブール値を渡す方が良いと思います

  bool isDesc

2:

var wines = db.Wines.Where(w => w.Active && w.ProducerID == producerID);
if(isDesc)
{ 
    wines = wines.OrderByDesc(w=>w.XXX);
}
else 
{
    wines = wines.OrderBy(w=>w.XXX);
}

var list = wines.ToList(); 

3:本当に匿名にしたい場合を除き、AutoMapperを使用してオブジェクトをあるタイプから別のタイプにマップする方がよいでしょうか。

于 2012-05-10T17:04:23.280 に答える
0

プロジェクトで jTable も使用しています。Ricci Gian Maria は、この「OrderBy」の問題を非常によくまとめています

上記の問題の解決策は非常に単純です。OrderBy LINQ 演算子がどのように機能するかを考え始めるだけでよいのです。基本的には、順序付け基準を表すラムダを受け入れます。顧客オブジェクトの場合、OrderBy( c=> c.顧客名)。プロパティを文字列として表現する問題は、OrderBy メソッドが Expression を受け入れることです。

Adam Anderson のブログは、Nick が提供した例に基づいています。彼は、jtSorting 文字列を Expression に変換できる OrderByHelper の素晴らしい例を持っています。OrderByHelper を使用すると、OrderBy メソッドを拡張して jtSorting を入力として受け入れることができます。彼のページから System.Linq.Expressions と System.Reflection を含む新しいクラスにコードをコピーします。OrderyHelper がプロジェクトの一部になったら、jtSorting を OrderBy パラメーターとして渡し始めることができます。コードは次のように単純化されます...

List<Wine> wines = db.Wines.OrderBy(jtSorting).Where(w => w.Active == true).Where(w => w.ProducerID == ProducerID).ToList();

お役に立てれば!

于 2013-02-11T22:03:36.567 に答える