2017-02-03 8 views
0

Ich versuche nur eine bestimmte Anzahl von Elementen zu erhalten, indem ich ein Prädikat als Parameter übergebe. Aber ich bin immer folgende Fehlermeldung:Prädikat als Parameter übergeben

Cannot implicitly convert type System.Collections.Generic.IEnumerable < Students.Entities> to bool

var names = await Task.Run(() => Repository.GetWithNChildren(e => e.Entities.Take(offset))); 


public List<T> GetWithNChildren(Expression<Func<T, bool>> predicate = null) 
{ 
    var db = _factory.GetConnectionWithLock(); 
    using (db.Lock()) 
    { 
     return db.GetAllWithChildren(predicate, true); 
    } 
} 

GetAllWithChildren ist ein Verfahren, in dem SQLite Klasse

namespace SQLiteNetExtensions.Extensions 
{ 
    public static class ReadOperations 
    { 
     public static bool EnableRuntimeAssertions; 

     public static T FindWithChildren<T>(this SQLiteConnection conn, object pk, bool recursive = false) where T : class; 
     public static List<T> GetAllWithChildren<T>(this SQLiteConnection conn, Expression<Func<T, bool>> filter = null, bool recursive = false) where T : class; 
     public static void GetChild<T>(this SQLiteConnection conn, T element, string relationshipProperty, bool recursive = false); 
     public static void GetChild<T>(this SQLiteConnection conn, T element, Expression<Func<T, object>> propertyExpression, bool recursive = false); 
     public static void GetChild<T>(this SQLiteConnection conn, T element, PropertyInfo relationshipProperty, bool recursive = false); 
     public static void GetChildren<T>(this SQLiteConnection conn, T element, bool recursive = false); 
     public static T GetWithChildren<T>(this SQLiteConnection conn, object pk, bool recursive = false) where T : class; 
    } 
} 
+0

die Linie, die den Fehler hat –

+0

Die erste Zeile – hotspring

+0

einen Fehler hat offensichtlich, dass die 'IEnumerable ' zurück von '.Nehmen()' nicht in 'Bool' umgewandelt werden. Was ist so überraschend? –

Antwort

1

Der Wert Func<T, bool> bedeutet eine Funktion, die in T nimmt und bool.

Die Funktion Take(int n) in IEnumerable<T> nimmt und gibt ein IEnumerable<T> die n Mitglieder höchstens hat.

Sie müssen e.Entities.Take(offset) etwas ändern, die eine Bool zurückgibt oder Schalter Expression<Func<T, bool>> predicate = null-Expression<Func<T, U>> predicate = null und GetAllWithChildren in der gleichen Art zu nehmen zu ändern.

+0

wenn ich es in '' ändere und dann 'GetAllWithChilldren' beschwert, weil es nur' 'akzeptiert, siehe meine aktualisierte Frage – hotspring

+0

Alles, was ich brauche, ist nicht alle Elemente, nur bestimmte Elemente (Offset) zu bekommen. – hotspring

1

Der Fehler ist richtig.
Dieser Ausdruck:

Expression<Func<T, bool>> 

bedeutet: "Ich eine Instanz von T nehmen, und wird eine boolean zurückgeben"

Aber Sie nicht Rückkehr eine booelean:

e => e.Entities.Take(offset) 

Diese ist, weil Take(..) Boolean nicht zurückgibt, aber stattdessen IEnumerable von Entities.

es zu beheben - versuchen, so etwas wie:

e => e.Entities.Take(offset).Count() > 3 
-2

Ich glaube, Sie Ihre Methode als Generika zu erklären, vergessen haben. so, statt

... GetWithNChildren(Expression<Func<T, bool>> predicate = null) 

sollten Sie haben:

GetWithNChildren<T>(Expression<Func<T, bool>> predicate = null) 
+0

Er würde einen anderen Fehler bekommen, wenn das der Fall ist, T wird wahrscheinlich auf Klassenebene definiert. –

+0

Danke Scott, das mag wahr sein. ;-) –