1

linq クエリで取得された他のいくつかの「列」に応じてステータスを設定するためのベスト プラクティスは何でしょうか。

  var result = (from q in query
                select new Item
                         {
                           ApprovedDate = q.ApprovedDate,
                           CreatedDate = q.CreatedDate,
                           DeclinedDate = q.DeclinedDate,
                           Status = 0
                         });

ステータスを 0、1、2 のいずれかに設定したいと思います。

(ApprovedDate == null and DeclinedDate == null) --> 0
(ApprovedDate != null and DeclinedDate == null) --> 1
(DeclinedDate != null) --> 3

したがって、おそらく次のようなものです:

  var result = (from q in query
                select new Item
                         {
                           ApprovedDate = q.ApprovedDate,
                           CreatedDate = q.CreatedDate,
                           DeclinedDate = q.DeclinedDate,
                           Status = (q.CreatedDate == null && q.DeclinedDate == null) ? 0 : (q.ApprovedDate != null && q.DeclinedDate == null) ? 1 : 2
                         });

ステータスの組み合わせをさらに追加する可能性があるので、これを linq select クエリ、リポジトリ オブジェクトで試してみる必要があります。または、後でコントローラーで .ToList() を実行し、リストを foreach して設定します正しいステータスコード?

ステータスコードが 3 つ以上あると、linq クエリは「読みにくく」なります。

4

2 に答える 2

2

ステータス計算をItemクラスに移動するのはどうですか?ステータス プロパティが他のプロパティ値に依存する場合、それは間違いなく計算されたプロパティです。

var result = from q in query
             select new Item
                         {
                           ApprovedDate = q.ApprovedDate,
                           CreatedDate = q.CreatedDate,
                           DeclinedDate = q.DeclinedDate
                         });

public class Item
{
  // other properties

  public int Status
  {
      get
      {
          if (ApprovedDate == null and DeclinedDate == null)
              return 0;
          if (ApprovedDate != null and DeclinedDate == null)
              return 1;
          if (DeclinedDate != null)
              return 3;
          // etc
      }
  }
}

この場合、ステータス計算ロジックが必要なデータに近いため、実際にはそれが最良のオプションだと思います。(何らかの理由で) このアプローチを使用できない場合は、設定ステータスをローカル アイテム コレクションに移動します。

var items = result.ToList().ForEach(i => i.Status = CalculateStatus(i));
于 2012-11-12T20:33:31.320 に答える
0

多分すべてを関数にラップして、このようなlinqを実行します

var result = (from q in query sele q).AsEnumerable()
                                       .Select( x => new Item()
                                       {
                                           ApprovedDate = x.ApprovedDate,
                                           CreatedDate = x.CreatedDate,
                                           DeclinedDate = x.DeclinedDate,
                                           Status = MyStatusFunction(x.CreatedDate,q.DeclinedDate)
                                       });


public int MyStatusFunction(DateTime ApprovedDate , Datetime DeclinedDate)
{
    if (ApprovedDate == null and DeclinedDate == null) return 0;
    else if(ApprovedDate != null and DeclinedDate == null) return 1;
    else if (DeclinedDate != null) return 3;
}
于 2012-11-12T20:33:45.473 に答える