2009-06-04 14 views
3

厳密に型指定されたStaffingPositionsDataContractのリストを、フィルタ名と値の別のリストでフィルタリングする必要があります。私はこれらの2つのリストを持っています:List <String>変数で厳密に型指定されたリストをフィルタリングするには

List<SerializedForm> deserializedObject = JsonConvert.DeserializeObject<List<SerializedForm>>(searchFilters).Where(x => !string.IsNullOrEmpty(x.value) && !string.Equals(x.value.ToUpper(), "ALL")).ToList(); 
    List<StaffingPositionsDataContract> staffingPositionResponse = new StaffingPositionsDataContract().LoadMockData(); 

deserializedObjectには2つのプロパティがあります。 1:「名前」、2:「値」。これらのプロパティは、異なるプロパティを持つ複数の異なるクラスをフィルタ処理できる必要があります。 StaffingPositionsDataContractが現在フィルタリングされている場合はint型またはdecimal型またはfloat型ではなく、文字列である場合に機能するメソッドがあります。以下は、私が使用しているのは、文字列フィルタのみで動作するものです。

var filteredPositions = staffingPositionResponse; 
     deserializedObject.ForEach(delegate(SerializedForm filters) 
     { 
      filteredPositions = _GetFilteredList<StaffingPositionsDataContract, string>(staffingPositionResponse, filters.name, new List<string> { filters.value }); 
     }); 

誰もが私はdeserializedObjectオブジェクトとstaffingPositionResponseクラスをフィルタリングすることができます方法を知っている:ここでは

private static List<T> _GetFilteredList<T, U>(IList<T> ListToFilter, string PropertyToFilterOn, List<U> FilterValues) 
    { 
     ParameterExpression p = Expression.Parameter(typeof(T), "x"); 

     Func<T, U> select = Expression.Lambda<Func<T, U>>(
      Expression.Property(p, PropertyToFilterOn), p).Compile(); 

     return ListToFilter.Join(FilterValues, select, u => u, (t, u) => t).ToList(); 
    } 

はそれが呼ばなっている方法ですか?

+0

- あなたはそれを呼び出す方法の例を与えることができますか?値は何ですか?私はint、文字列、浮動小数点で私のために働いた... –

答えて

3

ここでは、同様のことをするコンソールアプリケーションがあります。あなたのアプリケーションのフォームから適切なjsonのシリアル化を取得する方法を評価する必要があります。私はテスト目的のために辞書をjsonの文字列にするだけです。 (コメント再)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Newtonsoft.Json; 
using System.Reflection; 

namespace FilterLists 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      // set up the bunk json 
      var filters = new Dictionary<string, object>(); 
      filters.Add("PositionId", "12345"); 
      string json = JsonConvert.SerializeObject(filters); 
      // what's it look like as a string? 
      Console.WriteLine(json); 

      // take the json string and stuff it to our method. 
      var result = GetStaffingPosition(json); 
      Console.WriteLine(result.Count); 
     } 

    public static List<StaffingPositionsDataContract> GetStaffingPosition(string searchFilters) 
    { 
     var filters = JsonConvert.DeserializeObject<Dictionary<string, object>>(searchFilters).ToList(); 
     var contracts = StaffingPositionsDataContract.LoadMockData(); 

     List<StaffingPositionsDataContract> result = new List<StaffingPositionsDataContract>(); 

     foreach (var filter in filters) 
     { 
      foreach (var contract in contracts) 
      { 
       PropertyInfo info = typeof(StaffingPositionsDataContract).GetProperty(filter.Key); 
       var propType = info.PropertyType; 

       if (info.GetValue(contract, null).Equals(Convert.ChangeType(filter.Value, propType))) 
       { 
        result.Add(contract); 
       } 
      } 
     } 

     return result; 
    } 
} 


[Serializable] 
public class StaffingPositionsDataContract 
{ 
    public int PositionId { get; set; } 
    public string Series { get; set; } 
    public string BFY { get; set; } 
    public string BudgetStatus { get; set; } 
    public string DutyStation { get; set; } 
    public string OrgLocation { get; set; } 
    public string BudgetingEntity { get; set; } 
    public string FieldName { get; set; } 

    public static List<StaffingPositionsDataContract> LoadMockData() 
    { 
     List<StaffingPositionsDataContract> staffingposition = new List<StaffingPositionsDataContract>() 
     { 
      new StaffingPositionsDataContract() {PositionId = 12345, Series="", BFY="FY2010", BudgetStatus="Actual", DutyStation="", OrgLocation="", BudgetingEntity=""}, 
      new StaffingPositionsDataContract() {PositionId = 67891, Series="", BFY="FY2011", BudgetStatus="Actual", DutyStation="", OrgLocation="", BudgetingEntity=""}, 
      new StaffingPositionsDataContract() {PositionId = 12345, Series="", BFY="FY2010", BudgetStatus="Projected", DutyStation="", OrgLocation="", BudgetingEntity=""}, 
      new StaffingPositionsDataContract() {PositionId = 67892, Series="", BFY="FY2011", BudgetStatus="Projected", DutyStation="", OrgLocation="", BudgetingEntity=""}, 
      new StaffingPositionsDataContract() {PositionId = 987654, Series="", BFY="FY2010", BudgetStatus="Projected", DutyStation="", OrgLocation="", BudgetingEntity=""} 
     }; 
     return staffingposition; 
    } 
} 
} 
2

コンパイル時にプロパティ名がわからない場合にのみ、この方法を使用してください。次のように動作しているようです:

public static IEnumerable<T> WhereAny<T, U>(
    this IEnumerable<T> ListToFilter, string PropertyToFilterOn, List<U> FilterValues) 
{ 
    ParameterExpression p = Expression.Parameter(typeof(T), "x"); 
    var methodCall = Expression.Call(   
     Expression.Constant(FilterValues, typeof(List<U>)), 
     typeof(List<U>).GetMethod("Contains"), 
     Expression.PropertyOrField(p, PropertyToFilterOn) 
    ); 
    return ListToFilter.Where(Expression.Lambda<Func<T,bool>>(methodCall, p).Compile()); 
} 
+0

私はこのメソッドで同じ問題が発生します。エラーは "型の式 'System.Int32'は、 'Boolean Contains(System.String)'メソッドの 'System.String'型のパラメータに使用できません。 – Zacho

関連する問題