2016-05-25 3 views
0

複雑なオブジェクトを含むDataTableまたはDaatViewをフィルタリングします。DataTable/DataViewの複雑なオブジェクトをフィルタリングします。

はの私は、この対象者

public class Person{  

public int Id{get; set;}  
public int Age{get; set;}  
public strng Name{get; set;}  
public Address BillAddress{get; set;} 
} 

public class Address{   
public string 
Town{get; set}  
public string Street{get; set}  
public int Number{get; set} 
} 

は、今私はPersonオブジェクトのリストとのDataView記入しているとしましょう:私はPersonオブジェクトの10列とのDataViewを取得するようにするため

public static DataView ToObjectDataView<T>(this IList<T> list, int countOfColumns) 
    { 
    if (list == null || countOfColumns < 1) 
    { 
     return null; 
    } 
    int columns = countOfColumns; 

    DataTable dataTable = new DataTable(); 

    for (int currentCol = 0; currentCol != columns; currentCol++) 
    { 
     DataColumn column = new DataColumn(currentCol.ToString(), typeof(T)); 
     dataTable.Columns.Add(column); 
    } 

    DataRow row = null; 
    int currentColumn = 0; 
    for (int index = 0; index < list.Count; index++) 
    { 
     if (list[index] == null) 
     { 
      continue; 
     } 
     if (Equals(null, row)) 
      row = dataTable.NewRow(); 

     row[currentColumn] = list[index]; 
     currentColumn++; 

     if (currentColumn == columns) 
     { 
      dataTable.Rows.Add(row); 
      row = null; 
      currentColumn = 0; 
     } 
    } 

    //Verarbeitung der letzten Zeile 
    if (!Equals(null, row)) 
    { 
     dataTable.Rows.Add(row); 
    } 

    return new DataView(dataTable); 
    } 

を、 evrey列には、そのインデックスの名前を持っています

IList<Person> personList = new List<Person>(); 
// Fill the list... 
DataView dataSource = personList.ToObjectDataSource(10); 

今、私はこのDataViをフィルタリングしたいと思いますたとえば、「Fakestreet」に住むすべての人物を取得します。

私は見つけられませんでしたので、これは、部分的な解決策である

答えて

0

..私は「0.BillAddress.Street = 『Fakestreet』」(およびまたは、残りの列と表現)を試みたが、それは動作しません。直接的な方法。

のDataTable AsEnumerable拡張を使用して、動的LINQで

// Filter directly the List 
    public static List<T> FilterByLinqExpression<T>(this IList<T> list, string linqFilterExpression) 
    { 
    var result = list.AsQueryable().Where(linqFilterExpression); 
    return result.ToList<T>(); 
    } 

だから、あなたが住んでいるすべての人のために、このようにそれを呼び出すことができます(.NET 3.5)のためにも利用できるSystem.Linq.Dynamicを()フィルタその名に「アベニュー」を持っている通り:

IList<Person> personList = new List<Person>(); 
// Fill the list... 
var filteredValues = personList.FilterByLinqExpression("((BillAddress.Street).Contains(\"Avenue\"))"); 
DataView dataSource = filteredValues .ToObjectDataSource(10); 

私は例えばDevExpress社ASPxGridViewに表示されるように使用されている複雑なオブジェクトをフィルタリングするためにこれを使用します。ところで、彼らは、私のケースでは、与えられたフィルタ式を動的なlinq式に変換する 'CriteriaToWhereClauseHelper.GetDynamicLinqWhere()'というフィルタ式から、異なるフィルタ式への自動変換器を持っています。

関連する問題