Frage

Ich habe ein Modell auf meinem Datenbankmodell und ordnen Sie die Objekte in meinem Repository.

Doch offenbar macht es einen Unterschied, ob ich „neu wählen“ direkt in meinen GetUsers oder „wählen factoryresult“, wie nachstehend ausgeführt. Ich erhalte den Fehler zur Laufzeit, dass die Methode CreateFromDbModel keine Übersetzung SQL hat (System.NotSupportedException).

Gibt es eine Möglichkeit, um dieses? Kann ich es irgendwie flicken?

Der Grund für den Wunsch, die Factory-Methode zu verwenden, ist, dass ich Objekte instanziiert an anderer Stelle könnte und will an einem Ort den ‚Mapping-Code‘ halten ...

Vielen Dank für alle Kommentare, Anders

    public IQueryable<User> GetUsers(bool includeTeams)
    {
        return from u in _db.sc_Players
               where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam))
               select UserFactory2.CreateFromDbModel(u);
    }


    public static User CreateFromDbModel(sc_Player player)
    {
        return new User
                   {
                       Id = player.sc_PlayerID,
                       FirstName = player.FirstName.Trim(),
                       LastName = player.LastName.Trim(),
                       PresentationName = player.FirstName.Trim() + " " + player.LastName.Trim(),
                       LoginName = player.aspnet_User.LoweredUserName,
                       IsTeam = player.IsTeam,
                       Email = player.aspnet_User.aspnet_Membership.Email,
                       Password = player.aspnet_User.aspnet_Membership.Password
                   };
    }
War es hilfreich?

Lösung

Ist das Problem weil Sie IQueryable in Ihrer GetUsers Methode zurückkehren? Versuchen Liste Rückkehr statt. Dadurch wird die Linq Abfrage erzwingen innerhalb des Verfahrens auszuführen.

public List<User> GetUsers(bool includeTeams)
{
    return (from u in _db.sc_Players
    where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam))
    select UserFactory2.CreateFromDbModel(u)).ToList();
}

Nicht sicher, ob das Problem behoben wird, nur eine Ahnung. Ich war in der Lage zu duplizieren, was Sie auf einer lokalen Datenbank in LINQPad tun, und es funktionierte. Aber meine Probe wurde kein IQueryable zurückkehrt. Sind Sie furthur modifing die IQueryable Sammlung außerhalb von GetUsers ()?

Edit:

Ich habe einige Überprüfungen durchgeführt. Ich konnte den Fehler nur kopieren, wenn ich meine Probe so modifizierte, dass die IQueryable Sammlung in einer zweiten Linq-Abfrage verwendet wurde nach GetUsers () aufrufen:

IQueryable<User> query = GetUsers(true);

var q = from u in query
    where u.Name.Contains("Bob")
    select new {Name = u.FirstName + " " + u.LastName};

Ich wette, wenn Sie eine Liste zurückkehren wird, wie oben in GetUsers vorgeschlagen () wird der Fehler weg. Der einzige Nachteil ist, dass jede Filterung Sie tun nach GetUsers () nicht beschränkt die Menge der Daten aus der Datenbank zurückgegeben, weil Sie bereits ausgeführt haben, um die Abfrage beim Aufruf .ToList ().

Aufruf

Edit 2:

Leider glaube ich nicht, es gibt eine andere Möglichkeit, Ihre Factory-Methode in der Abfrage. Ich mache eine weitere Idee. Sie können eine Erweiterungsmethode für IQueryable erstellen, rufen Sie es so etwas wie ToUserList (). Innerhalb ToUserList () Sie rufen ToList () auf der Abfrage und Ihre Factory-Methode, dass gibt eine Sammlung von Benutzern. Rufen Sie diese Methode, wenn Sie fertig sind Filterung der Daten mit Linq. Dies ermöglicht es Ihnen, nur die Abfrage ausgeführt wird, wenn Sie bereit sind, die Daten aus der Datenbank zu laden. Ein Beispiel ist unten angegeben.

public static List<Users> ToUserList(this IQueryable<User> query)
{
     return query.ToList().Select(u => UserFactory2.CreateFromDbModel(u)); 
}

Rufen Sie die Extension-Methode wie folgt aus:

// Filter the data using linq. When you are ready to execute the query call:
query.ToUserList(); // Query will execute and a list of User objects returned.

Hope macht Sinn. Douglas H.

Andere Tipps

Der Fehler ziemlich erklärt alles.

"Methode CreateFromDbModel keine Übersetzung SQL (System.NotSupportedException) haben"

Ihre CreateFromDbModel Methode ist keine SQL-Funktion. Ihre Bewerbung wird nicht möglich sein, die CreateFromDbModel Funktion laufen, bis die Objekte sind speziell auf Sie vom Server zurückgegeben. Sie werden höchstwahrscheinlich eine ToList nennen haben () oder etwas ähnliches auf Ihrer Anfrage, bevor Sie CreateFromDbModel auf ihnen ausgeführt werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top