2016-07-15 7 views
1

KlasseFilterung eine Liste von einem Objekt mit Liste der Zeichenfolge Eigenschaften

public class AlldataPoints 
    { 
    public int phase{ get; set; } 
    public string recr{ get; set; } 
    public string study{ get; set; } 
    } 


public class filter 
{ 
    public List<string> Phase; 
    public List<string> recr; 
    public List<string> study; 

} 

Ich habe eine Liste von oben Klasse sagen Alldatapoints ‚LST‘ und ein Objekt der Klasse Filter ‚obj‘.

Ich möchte nur diejenigen Zeilen von 'lst' filtern, in denen Werte von Phasen in 'obj' mit 'lst' 'Phasen' übereinstimmen und Werte von 'recr' in 'obj' mit 'recr' in 'lst übereinstimmen "Recr". Ich möchte den Entity-Ausdruck verwenden.

+0

Sie haben mit Entity-Framework getaggt. Ist diese "Liste der Alldatapunkte" eine tatsächliche "Liste " oder eine Entity in Ihrem DbContext? Dies kann die möglichen Antworten beeinflussen. Wenn es sich um eine tatsächliche Liste handelt, entfernen Sie das Entity-Framework-Tag. – Rhumborl

Antwort

1

Verwenden Contains auf der Liste der Filter Argumente:

filter obj; 
IEnumerable<AlldataPoints> lst; 
var result = lst.Where(item => obj.Phase.Contains(item.phase) && obj.recr.Contains(item.recr)); 
0

Hier gehen Sie:

public List<AlldataPoints> FilterPoinst(List<AlldataPoints> points, filter filter) 
{ 
    return points.Where(x => filter.Phase.Contains(x.phase) 
     && filter.recr.Contains(x.recr) 
     && filter.study.Contains(x.study)).ToList(); 
} 

Wenn Sie ony eine Eigenschaft übereinstimmen müssen dann nur && mit || Operator ersetzen:

In Ihrem Code rufen Sie einfach diese Funktion:

var filter = new filter(); //init your filter 
List<AlldataPoints> points = new List<AlldataPoints>(); // Here you should get your points 
var filteredPoints = FilterPoinst(points, yourFilter); //you get your filtered points. 
0

Wenn dies eine Linq-to-Entities-Abfrage für Ihren DbContext ist, können Sie immer noch Contains() verwenden, um zu überprüfen, ob sich jeder Wert in der entsprechenden Liste befindet.

Sobald umständlich ist, dass man phase in eine Zeichenfolge konvertieren, da es ein int ist und die Liste ist ein List<string>, aber man kann einfach nicht ToString() verwenden, haben Sie SqlFunctions.StringConvert() verwenden - siehe this answer.

dbContext.AllDataPoints.Where(adp => 
    filter.Phase.Contains(SqlFunctions.StringConvert((double)adp.phase).Trim()) 
    && filter.recr.Contains(adp.recr) 
    // && filter.study.Contains(adp.study) 
) 
Verwandte Themen