2017-06-12 30 views
1

我有一個網格(n)動態生成的列。其中一個要求是,如果在一個顯示的列中存在非空/非零值,則只在網格中顯示一行。我正在使用Infragistics XamGrid,它可以選擇使用行篩選器來接受表達式作爲篩選條件。我已經將我的列的Key綁定到MyObject屬性。如何使用LINQ結合(n)個表達式?

我想根據我的網格中顯示的列生成一個表達式鏈。這裏是一些僞代碼,顯示我想要完成的想法

System.Linq.Expressions.Expression<Func<MyObject, bool>> expr = product => 
{ 
    foreach (var p in MyGrid.Columns.Where(co => co.DataType == typeof (decimal?) && co.Visibility == Visibility.Visible)) 
    { 
     Expression<Func<MyObject, bool>> exprInner = lrnc => ((decimal?) lrnc.GetPropValue(p.Key)) != 0.0m; 
     combined = System.Linq.Expressions.Expression.OrElse(combined.Body, exprInner.Body); 
    } 
}; 
+3

是這樣的? http://www.albahari.com/nutshell/predicatebuilder.aspx – hatchet

+0

@hatchet謝謝,這給了我所需要的所有信息。 – TychoBrahe

回答

0

非常感謝斧頭和他的聯繫。我能夠動態地將基於反射屬性的表達式組合起來,爲我的XamGrid創建一個RowsFilter。

private RowsFilter m_rowsFilter; 

private void CreateFilter() 
{ 
    CustomComparisonCondition c = new CustomComparisonCondition(); 

    var predicate = PredicateBuilder.False<LineRatingNodeComparison>(); 
    foreach (string colKey in MyXamGrid.Columns.Where(co => co.DataType == typeof (decimal?) && co.Visibility == Visibility.Visible).Select(co => co.Key)) 
    { 
     string tempKey = colKey; 
     predicate = predicate.Or(p => p.GetPropValue(tempKey) != null && (decimal?) p.GetPropValue(tempKey) != 0.0m); 
    } 
    c.Expression = predicate; 

    //Add the RowsFilter to one column that always exists on the grid. 
    m_rowsFilter = new RowsFilter(typeof (MyObject), MyXamGrid.Columns.DataColumns["Company"]); 
    m_rowsFilter.Conditions.Add(c); 
    MyXamGrid.FilteringSettings.RowFiltersCollection.Add(m_rowsFilter); 
}