3

関数内の次のクエリから条件文を抽出できるようにしたい。これは EF クエリへの linq です。どうすればいいですか?オブジェクト指向の原則を適用するための代替方法はありますか (オープン/クローズなど)?

    var query = new UvwRequestAssignmentManagementBO().GetAll().Where(uvw => (uvw.FK_ProcessStep == 2)
        && (uvw.FK_Entity == SecurityContext.Current.User.FK_Entity)
       && (uvw.FK_Manager == 15))
       .Select(p => new ReqSupAdminGridVm()
                {
                    NameFamily = p.NameFamily,
                    RequestDate = p.RequestDate,
                    RequestNo = p.RequestNo,
                    RequestType = p.RequestType == 1 ?"a"
                                          : (p.RequestType == 2 ? "b"
                                          : (p.RequestType == 3 ? "c" :
                                          (p.RequestType == 4 ? "d" : ""))),
                    RequestEvaluationStatus = p.RequestEvaluationStatus_Aggregation == 1 ? "a"
                                          : (p.RequestEvaluationStatus_Aggregation == 2 ? "b"
                                          : (p.RequestEvaluationStatus_Aggregation == 3 ?"c" 
                                          :(p.RequestEvaluationStatus_Aggregation == 4 ? "d" : ""))), 
                });

たとえば、書く代わりに:

    RequestType = p.RequestType == 1 ?"a"
                                          : (p.RequestType == 2 ? "b"
                                          : (p.RequestType == 3 ? "c" :
                                          (p.RequestType == 4 ? "d" : ""))),

これを別のクラス内に記述できるようにしたい:

RequestType = ReqType.GetReqType(p.RequestType);

string GetReqType(int type){

           switch(type){
                      case 1:
                       return "a";
                      case 2:
                       return "b";
                          }
}
4

3 に答える 3

2

PredicateBuilderをチェックしてください。あなたが求めていると思うことを実行できます。最近のプロジェクトで自分で使用しましたが、コードは再利用可能で読み取り可能です。

モデル用に次のような述語を作成します。

using System;
using System.Linq;
using System.Linq.Expressions;

namespace MyModels
{
    using Predicate = Expression<Func<Component, bool>>;

    public partial class Component
    {
        public static Predicate HasKeywordContaining(string keyword)
        {
            return c => c.Keywords.Any(k => k.Value.Contains(keyword));
        }

        public static Predicate IsOwnedBy(string ownerName)
        {
            return c => c.OwnerName.Contains(ownerName);
        }

        public static Predicate HasPartNoContaining(string partNo)
        {
            return c => c.PartNo.Contains(partNo);
        }
    }
}

これらを使用して、次のようなクエリを作成できます。

var whereComponent = PredicateBuilder.True<Component>();

whereComponent = whereComponent.And(Component.HasKeywordContaining(keyword));
whereComponent = whereComponent.And(Component.IsOwnedBy(ownerName));

var components = from c in db.Components.Where(whereComponent)

もちろん、これにはクライアント側のフィルタリングは含まれません。

于 2013-09-10T07:28:31.897 に答える
1

次のように、別のクラスに拡張メソッドを作成します。

public static class ReqTypeExtension
{
    public static string GetReqType(this int reqType)
    {
        switch (reqType)
        {
            case 1:
                return "a";
            case 2:
                return "b";
            case 3:
                return "c";
            case 4:
                return "d";
        }

        return "";
    }
}

次のように使用します。

RequestType = p.RequestType.GetReqType()

この構文に設定されている場合:

RequestType = ReqType.GetReqType(p.RequestType);

次のように、ReqType クラスで静的メソッドを宣言します。

public class ReqType {

    public static string GetReqType(int reqType)
    {
        switch (reqType)
        {
            case 1:
                return "a";
            case 2:
                return "b";
            case 3:
                return "c";
            case 4:
                return "d";
        }

        return "";
    }
}
于 2013-09-10T19:04:41.947 に答える
0

これはうまくいくはずです

    var query = new UvwRequestAssignmentManagementBO().GetAll().Where(uvw => (uvw.FK_ProcessStep == 2)
        && (uvw.FK_Entity == 1)
        && (uvw.FK_Manager == 15))
        .Select(p => new ReqSupAdminGridVm
        {
            NameFamily = p.NameFamily,
            RequestDate = p.RequestDate,
            RequestNo = p.RequestNo,
            RequestType = GetReqType(p.RequestType),
            RequestEvaluationStatus = GetReqEvalStatus(p.RequestEvaluationStatus_Aggregation),
        });

次のローカル ヘルパー関数を追加する場合:

private static string GetReqEvalStatus(int agg)
{
    switch (agg)
    {
        case 1: return "a";
        case 2: return "b";
        case 3: return "c";
        case 4: return "d";
        default: return "";
    }
}

private static string GetReqType(int type)
{
    switch (type)
    {
        case 1: return "a";
        case 2: return "b";
        case 3: return "c";
        case 4: return "d";
        default: return "";
    }
}

IdeOne で実際に動作する様子をご覧ください

必要に応じて、ヘルパー関数を別のクラス/ファイル ( http://ideone.com/EsK6W8 )に移動できます。

            RequestType = ReqType.GetReqType(p.RequestType),
            RequestEvaluationStatus = ReqEvalStatus.GetReqEvalStatus(p.RequestEvaluationStatus_Aggregation),

そして別のファイルで:

static internal class ReqEvalStatus
{
    public static string GetReqEvalStatus(int agg)
    {
        switch (agg)
        {
            case 1: return "a";
            case 2: return "b";
            case 3: return "c";
            case 4: return "d";
            default: return "";
        }
    }
}

static internal class ReqType
{
    public static string GetReqType(int type)
    {
        switch (type)
        {
            case 1: return "a";
            case 2: return "b";
            case 3: return "c";
            case 4: return "d";
            default: return "";
        }
    }
}
于 2013-09-10T07:29:45.103 に答える