2009-06-08 5 views
1

私はこの答えをインターネットで精査し、いくつかの開発者に尋ね、不足しています。私はStaffingPositionsDataContractと呼ばれるクラスを持っています。これは、模擬データ(今のところ)をリスト<にロードして、ページに戻ります。これはうまくいっていますが、画面に入力された値の別のリストに基づいてリストをフィルタリングし、JSONとしてこのサービスに送信してから、同じクラスのリストに逆シリアル化する必要があります。ここで は、サービスメソッドであるなど、そのすべてがnullの場合も、または1つがnullの場合も、ユーザーはこれらのクラスのメンバーのいずれかでフィルタできることに注意してください:ここでは同じクラスのオブジェクトで汎用リスト<>をフィルタリングするには

public List<StaffingPositionsDataContract> GetStaffingPosition(string searchFilters) 
    { 
     var filters = JsonConvert.DeserializeObject<List<StaffingPositionsDataContract>>(searchFilters); 
     IList<StaffingPositionsDataContract> contracts = new StaffingPositionsDataContract().LoadMockData(); 

     if (searchFilters.Length > 4) 
     { 
      //Filter contracts here! 
     } 

     return contracts; 
    } 

はモックとデータ契約クラスです読み込むデータ:

[DataContract] [Serializable] 
public class StaffingPositionsDataContract 
{ 
    [DataMember(Order = 1)] public int PositionId { get; set; } 
    [DataMember(Order = 2)] public string Series { get; set; } 
    [DataMember(Order = 3)] public string BFY { get; set; } 
    [DataMember(Order = 4)] public string BudgetStatus { get; set; } 
    [DataMember(Order = 5)] public string DutyStation { get; set; } 
    [DataMember(Order = 6)] public string OrgLocation { get; set; } 
    [DataMember(Order = 7)] public string BudgetingEntity { get; set; } 
    [DataMember(Order = 8)] public string SeriesTitle { get; set; } 
    [DataMember(Order = 9)] public int PersonnelId { get; set; } 
    [DataMember(Order = 10)] public string PositionStatus { get; set; } 
    [DataMember] public int RecId { get; set; } 

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

フィルタは、常に1つ、一部またはすべての値が入力されるリストです。あなたができるなら私の正気と助けを保存してください!ありがとう!

私はこれを、これらの類似したデータクラス(多くのものがあります)で使用できる汎用関数にすることを本当に念頭に置いておくべきです。

+0

フィルタリストの例を挙げることはできますか? – steamer25

+0

確かに、ここにその一部があります。 BFY = nullを、 BudgetStatus =「実際」、 PositionId = 12345、 PersonnelId = 0 – Zacho

答えて

1

フィルタリングする場所をフィルタリングしません。フィルタをコレクションのロードに渡して、その基準をサービスやデータベースなどに渡すか、またはコレクションにコレクションを追加する前に条件ごとに各オブジェクトを検証するようにして内部的に使用します。

public List<StaffingPositionsDataContract> GetStaffingPosition(string searchFilters) 
{ 
    var filters = JsonConvert.DeserializeObject<List<StaffingPositionsDataContract>>(searchFilters); 
    IList<StaffingPositionsDataContract> contracts = new StaffingPositionsDataContract().LoadMockData(searchFilters); 

    return contracts; 
} 

[DataContract] [Serializable] 
public class StaffingPositionsDataContract 
{ 
    [DataMember(Order = 1)] public int PositionId { get; set; } 
    [DataMember(Order = 2)] public string Series { get; set; } 
    [DataMember(Order = 3)] public string BFY { get; set; } 
    [DataMember(Order = 4)] public string BudgetStatus { get; set; } 
    [DataMember(Order = 5)] public string DutyStation { get; set; } 
    [DataMember(Order = 6)] public string OrgLocation { get; set; } 
    [DataMember(Order = 7)] public string BudgetingEntity { get; set; } 
    [DataMember(Order = 8)] public string SeriesTitle { get; set; } 
    [DataMember(Order = 9)] public int PersonnelId { get; set; } 
    [DataMember(Order = 10)] public string PositionStatus { get; set; } 
    [DataMember] public int RecId { get; set; } 

    public List<StaffingPositionsDataContract> LoadMockData(string searchfilters) 
    { 
     // filter the list returned here 

     List<StaffingPositionsDataContract> staffingposition = new List<StaffingPositionsDataContract>() 
     { 
      new StaffingPositionsDataContract() {RecId=1, PositionId = 12345, Series="", BFY="FY2010", BudgetStatus="Actual", DutyStation="", OrgLocation="", BudgetingEntity=""}, 
      new StaffingPositionsDataContract() {RecId=2, PositionId = 67891, Series="", BFY="FY2011", BudgetStatus="Actual", DutyStation="", OrgLocation="", BudgetingEntity=""}, 
      new StaffingPositionsDataContract() {RecId=3,PositionId = 12345, Series="", BFY="FY2010", BudgetStatus="Projected", DutyStation="", OrgLocation="", BudgetingEntity=""}, 
      new StaffingPositionsDataContract() {RecId=4,PositionId = 67892, Series="", BFY="FY2011", BudgetStatus="Projected", DutyStation="", OrgLocation="", BudgetingEntity=""}, 
      new StaffingPositionsDataContract() {RecId=5,PositionId = 987654, Series="", BFY="FY2010", BudgetStatus="Projected", DutyStation="", OrgLocation="", BudgetingEntity=""} 
     }; 
     return staffingposition; 
    } 
} 
0

どのようにフィルタリングしていますか? jsonから非直列化された契約を除外していますか?あなたは平等を評価することに問題がありますか?ここで問題を解決するのは少し難しいです。

別で1つのリストをフィルタリングすることはLINQのと非常に簡単です:

var foo = new int[]{1,2,3,4,5}; 
var bar = new int[]{1,3,5}; 
var result = from x in foo where !bar.Contains(x) select x; 

これは、あなたは自分をテストするものは何でも等価行い、あなたのデータコントラクトでequalsメソッドを持っている必要があり2、4 を含む結果になり要件が必要です。

ユーザーがUIをフィルタリングするために1からnの契約を「作成する」ことができ、これを契約の集合(すべてがnullでない可能性があります)として取得することができます。 Zachoさんのコメントに応えて


var foo = new string[]{"1","2","3","4","5"}; 
var bar = new string[]{"1","3",null,"5"}; 
var result = from x in foo where !bar.Contains(x) select x; 

列挙フィルタ - バー - ヌルが含まれています。この機能は機能します。この解決策があなたのために働かない場合、Zacho、別の問題があります。私の推測では、それは平等の比較と関係があります。

+0

は私のアイデアを好きですが、これは、フィルタのメンバーの一部がnullの場合もあるので、仕事なので、上の例のフィルタを使用していません何もない。 – Zacho

+0

良い見通し。あなたのサンプルが機能するというあなたの権利、それは私のために働いたが、まったく同じアイデアを使用し、私の使用のために適切な値を差し込んでも、フィルターは機能しません。ここに私がやっていることがあります。 var resultx =契約の中のどこから!filters.Contains(x)select x; – Zacho

+0

オブジェクトにEqualsを実装する必要があります。 Containsは、参照チェックであるEquals(System.Object上)の既定の実装を使用しています。オブジェクト内のプロパティが等しいかどうかをチェックするEqualsの実装が必要です。それが理解できない場合は、CLR経由でC#を取得し、それを読むことをお勧めします。 – Will

0

両方のコレクションのアイテムをXElementsに送信し、各プロパティをXAttributeにします。

次に、属性を比較して一致を見つけることができます。これは簡単です。

public class Customer 
{ 
    public int CustomerId { get; set; } 
    public string Name { get; set; } 
    public string FavoriteColor { get; set; } 

    // probably a better way to do this 
    // just writing fast for demo 
    public XElement ToXElement() 
    { 
     List<XAttribute> attributes = new List<XAttribute>(); 

     if (this.CustomerId != 0) 
      attributes.Add(new XAttribute("CustomerId", this.CustomerId)); 
     if (this.Name != null) 
      attributes.Add(new XAttribute("Name", this.Name)); 
     if (this.FavoriteColor != null) 
      attributes.Add(new XAttribute("FavoriteColor", this.FavoriteColor)); 

     XElement result = new XElement("Customer", attributes); 
     return result; 
    } 
} 

次にそれらを比較する....また

List<Customer> source = new List<Customer>() 
{ new Customer(){ CustomerId=1, FavoriteColor="Blue", Name="Alex" }, 
    new Customer(){ CustomerId=2, FavoriteColor="Green", Name="Bob" }, 
    new Customer(){ CustomerId=3, FavoriteColor="Blue", Name="Cindy" }, 
    new Customer(){ CustomerId=4, FavoriteColor="Red", Name="Darren" } 
}; 
List<Customer> examples = new List<Customer>() 
{ new Customer(){ FavoriteColor="Blue", CustomerId = 3}, 
    new Customer(){ Name="Darren"} 
}; 

List<XElement> sourceElements = source.Select(c => c.ToXElement()).ToList(); 
List<XElement> exampleElements = examples.Select(c => c.ToXElement()).ToList(); 

//and now the query... 
var query = sourceElements 
    .Where(s => exampleElements 
    .Any(ex => ex.Attributes() 
     .All(exatt => s.Attribute(exatt.Name).Value == exatt.Value) 
    ) 
); 

foreach(XElement x in query) 
    Console.WriteLine(x); 

  • あなたが1つの空の例(すべてのデフォルト)に送信した場合、あなたは全体のソースリストを取り戻します。
  • サンプルを送信しない場合(空のリスト)、何も返されません。
+0

例がありますか? – Zacho

関連する問題