Frage

Ich habe eine einfache Datenbank mit zwei Tabellen. Benutzer und Konfigurationen. Ein Benutzer hat einen Fremdschlüssel es auf eine bestimmte Konfiguration zu verbinden.

Ich habe ein seltsames Problem, wo die folgende Abfrage verursacht immer ein innere in die Konfigurationstabelle verbinden, unabhängig von dem zweiten Parameterwert. Soweit ich das beurteilen kann, auch wenn der „Benutzerkonfiguration =“ Teil der Objekt Initialisierung bedingt ist, ist LINQ nicht sehen, dass und feststellt, dass eine Beziehung, in jedem Fall gefolgt ist.

Wenn ich tatsächlich die letzte Initialisierung entfernen, funktioniert das Ganze wie erwartet. Dabei spielt es keine innere Verknüpfung, wenn loadConfiguration == false und es ist beitreten, wenn loadConfiguration == true.

Wer hat irgendwelche Ideen dazu? Ist diese Syntax nur nicht zur Arbeit gehen? Der einzige Gedanke, den ich jetzt habe, ist die Rückkehr in einer grundlegenden if-Anweisung zu wickeln. - Ich wollte nur die duplizierten Zeilen vermeiden

public UserAccount GetByUsername(string username, bool loadConfiguration)
{
    using (Database database = new Database())
    {
        if (loadConfiguration)
        {
            DataLoadOptions loadOptions = new DataLoadOptions();
            loadOptions.LoadWith<User>(c => c.Configuration);
            database.LoadOptions = loadOptions;
        }

        return (from c in database.Users
                where c.Username == username
                select new UserAccount
                {
                    ID = c.ID,
                    ConfigurationID = c.ConfigurationID,
                    Username = c.Username,
                    Password = c.Password.ToArray(),
                    HashSalt = c.HashSalt,
                    FirstName = c.FirstName,
                    LastName = c.LastName,
                    EmailAddress = c.EmailAddress,

                    UserConfiguration = (loadConfiguration) ? new ApplicationConfiguration
                    {
                        ID = c.Configuration.ID,
                        MonthlyAccountPrice = c.Configuration.MonthlyAccountPrice,
                        TrialAccountDays = c.Configuration.TrialAccountDays,
                        VAT = c.Configuration.VAT,
                        DateCreated = c.Configuration.DateCreated

                    } : null

                }).Single();
    }
}

Vielen Dank im Voraus,

Martin.

War es hilfreich?

Lösung

Ich glaube nicht, dass es wird wie das funktioniert.

Ich schlage vor, es in 2 verschiedene Abfragen zu splitten.

Es gibt wahrscheinlich bessere Möglichkeiten, aber es wäre mehr verlangen ‚plumbling‘.

Andere Tipps

Nein, das wird nicht funktionieren. Ich habe schon viele Male in ähnliche Probleme stoßen. Der Grund dafür hat mit Ausdrücken bei der Kompilierung vs. Bedingungen zur Laufzeit zu tun.

Sie könnten zwei Abfragen tun oder wenn Sie nicht Beitritt nichts dagegen unabhängig von loadConfiguration Parameter zur Konfiguration, könnten Sie verwenden:

var q = (from c in database.Users
                where c.Username == username
                select c).Single();

und dann mit Linq-to-Objekten auf dem Ergebnis.

Ersetzen .Single () mit SingleOrDefault () und Linq wird zu einer linken äußeren Schalter verbinden. Ich weiß nicht, ob in Ihrem Fall es wird es tun, aber in manchen Fällen kann es der Fall ist.

Bearbeiten dint sehen, die Einzel für die gesamte Abfrage und nicht für Konfigurationsteil war:

versuchen Sie dies:

     UserConfiguration = (loadConfiguration && c.Configuration != null) ? new ApplicationConfiguration
     {
          ID = c.Configuration.ID,
          MonthlyAccountPrice = c.Configuration.MonthlyAccountPrice,
          TrialAccountDays = c.Configuration.TrialAccountDays,
          VAT = c.Configuration.VAT,
          DateCreated = c.Configuration.DateCreated
      } : null
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top