2012-03-25 4 views
0

Ich versuche, einen Linq-Ausdruck zu verwenden, um eine Liste in einer generischen Methode zu filtern, und kann es nicht richtig bekommen. HierWie kann ich einen Linq-Ausdruck enthalten, um eine Liste von generischen Elementen zu überprüfen

ist, wie es aussieht:

der Anruf:

  Expression<Func<SomeObject, object>> screen = i => i.BooleanFlag == false; 
     SomeObjectList.Build<SomeObject>(
      screen, 
      NonBuiltListOfTypeSomeObject); 
     } 

die Methode:

public void Build<T>(
     Expression<Func<T,object>> screen, 
     List<T> items) where T : class 
    { 
     this.Values = items.Select(f => new ModelForBuild() 
     { 
      //Build Parameters 
     }).ToList(); 
    } 

Was ich versuche, um die Elemente zu tun Bildschirm ist, bevor sie in gebaut werden this.Values. Ich übergebe den Linq-Ausdruck, der versucht, den Zugriff basierend auf der booleschen Eigenschaft in SomeObject zu verweigern. Allerdings sagt der Compiler mir, dass ich nicht

verwenden können
this.Values = items.Where(screen).Select(f => new ModelForBuild()... 

Ich habe versucht, verschiedene Möglichkeiten, so vielleicht gibt es einen besseren Weg, dies zu tun, wenn ja, was auf diese Weise ist OR wie kann ich effektiv die Linq-Ausdruck enthalten um die Liste der Artikel zu screenen?

EDIT

Fehlermeldung aus .Where (Bildschirm)

Error 1 Instance argument: cannot convert from 'System.Collections.Generic.List<T>' to 'System.Linq.IQueryable<T>'

Error 2 'System.Collections.Generic.List<T>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Queryable.Where<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)' has some invalid arguments

Error 24 Argument 2: cannot convert from 'System.Linq.Expressions.Expression<System.Func<T,object>>' to 'System.Linq.Expressions.Expression<System.Func<T,bool>>'

+1

Sie geben ein Objekt anstelle eines booleschen Werts zurück. Ändern Sie 'Func ' zu 'Func ' oder 'Prädikat '. –

+0

@ AS-CII - keiner von denen arbeitete. –

+0

Verwenden Sie Linq zu Objects oder eines von Linq zu Sql/Entities? – Phil

Antwort

3

Ich glaube, Sie so etwas wie dies bedeuten:

void Main() 
{ 
    var builder = new Builder(); 
    var unbuilt = new List<ModelForBuild>(); 
    builder.Build<ModelForBuild>(m => m.Id == 0, unbuilt); 
} 

public class Builder 
{ 
    public IEnumerable<ModelForBuild> Values{ get; private set; } 

    public void Build<T>(Func<T, bool> screen, 
          IEnumerable<T> items) where T : class 
    { 
     Values = items.Where(screen).Select(
      i => new ModelForBuild{ Id = 1 }).ToList(); 
    } 
} 

public class ModelForBuild 
{ 
    public int Id {get;set;} 
} 

Sie brauchen nicht Expression<T> zu verwenden.

+0

Sie rufen nicht 'Wo' ... –

+0

Ich bin jetzt, danke :) – Phil

+0

@Phil - Der Compiler mag diese Einrichtung, danke für den Tipp auf Ausdruck. –

0

Was wollen Sie erreichen? Ich glaube, Sie missbrauchen Ausdrücke hier.

Verwenden Sie einfach die Where-Methode. Es wird nicht ausgeführt, bis Sie über die Sammlung iterieren oder die Methoden ToList/ToArray/... verwenden.

items.Where(i => i.BoolProperty).Select(i => new ModelForBuild()... 

Dies wird nur MFB für die Elemente instanziiert, die das in das Prädikat übergeben, und ist der richtige Weg, es zu tun, wenn ich verstehe, was Sie tun ying.

+0

@Yoyre Nathan - Das kann man nicht mit Generika machen, weil es keine Definition gibt für welche Felder sie haben. –

+0

@TravisJ Ich habe die Frage nicht verstanden. +1 für deine Antwort. – SimpleVar

Verwandte Themen