2016-05-26 10 views
0

ich Artikel wie diesen zu lesen: Error: The entity or complex type cannot be constructed in a LINQ to Entities queryLinq Abfrage wirft Einheit oder komplexen Typ kann nicht in einer Linq zu Einheit aufgebaut werden, auch wenn ich den Klassennamen nur mit ausgewählten neuen entfernen {..}

So entnehme ich, dass in meiner Anfrage sollte ich von select new rpm_scrty_rpm_usr{.. ändern dann select new { ...

dann gehe ich von Fehlermeldung von

  • ex sein { "Die Entität oder komplexen Typ‚ConAppTester.rpm_scrty_rpm_usr‘kann nicht in einer LINQ to Entities-Abfrage erstellt werden. "} {System.Exception System.NotSupportedException}

stattdessen es nicht kompilieren und

Fehler 3 bekommen kann nicht implizit Typ System.Collections konvertieren. Generic.List < AnonymousType # 1 > System.Collections.Generic.List <ConAppTester.rpm_scrty_rpm_usr> C: \ dev \ RLISAdmin \ ConAppTester \ DbMethods.cs 51 11 ConAppTester

Methode

public List<rpm_scrty_rpm_usr> GetUsers() 
{ 
    var queryAllUsers = (from ru in db.rpm_usr 
           join ei in db.emp_info on ru.wwid equals ei.wwid 
           let cdis_eml = ei.dmn_addr + ";" 
           where ru.inact_ind == "N" && ei.inact_ind == "N" && ei.dmn_addr != null 
           orderby ei.dmn_addr 
           select new rpm_scrty_rpm_usr{ 
            usr_id = ru.usr_id, 
            usr_lnm = ru.usr_lnm, 
            usr_pwd = ru.usr_pwd, 
            usr_fnm = ru.usr_fnm, 
            wwid = ru.wwid, 
            apprvr_wwid = ru.apprvr_wwid, 
            chg_dtm = ru.chg_dtm, 
            chg_usr_id = ru.chg_usr_id, 
            dflt_ste_id = ru.dflt_ste_id, 
            cre_dtm = ru.cre_dtm, 
            cre_usr_id = ru.cre_usr_id, 
            lst_pwd_chg_dtm = ru.lst_pwd_chg_dtm, 
            lst_accs_dtm = ru.lst_accs_dtm, 
            email_id = ru.email_id, 
            inact_ind = ru.inact_ind, 
            salt = ru.salt, 
            tel = ru.tel 
           }).ToList(); 
    return queryAllUsers; 
} 

Context Referenz

private RPMContext db = new RPMContext(); 

Kontextdatei

public DbSet<rpm_scrty_rpm_usr> rpm_usr { get; set; } 
public DbSet<rpm_scrty_emp_info> emp_info { get; set; } 

POCOS

public class rpm_scrty_rpm_usr 
{ 
    [Key] 
    public string usr_id { get; set; } 

    public string usr_fnm { get; set; } 
    public string usr_lnm { get; set; } 
    public string usr_pwd { get; set; } 
    public string email_id { get; set; } 
    public string wwid { get; set; } 
    public string tel { get; set; } 
    public int dflt_ste_id { get; set; } 
    public DateTime? lst_pwd_chg_dtm { get; set; } 
    public DateTime? lst_accs_dtm { get; set; } 
    public string apprvr_wwid { get; set; } 
    public string inact_ind { get; set; } 
    public string cre_usr_id { get; set; } 
    public DateTime? cre_dtm { get; set; } 
    public string chg_usr_id { get; set; } 
    public DateTime? chg_dtm { get; set; } 
    public string salt { get; set; } 
} 

Andere poco

public class rpm_scrty_emp_info 
{ 
    [Key] 
    public string idsid { get; set; } 

    public string wwid { get; set; } 
    public string dmn_addr { get; set; } 
    public string inact_ind { get; set; } 
} 
+2

Übrigens, warum haben Sie [zwei Konten] (http://stackoverflow.com/q/37470564/861716)? –

+0

Mitarbeiter und ich beide versuchen, Probleme zu lösen! :) –

+0

Warum machst du nicht einfach 'select ru'? –

Antwort

0

Ihr Problem ist, dass, da die Fehlermeldung sagt, L2E nicht über Ihr Unternehmen nicht kennt. Die Funktionsweise ist, dass nichts passiert, bis Sie die Abfrage aufzählen. In Ihrem Fall wird ToList() dies tun. An diesem Punkt wird die Datenbank versuchen und die Abfrage ausführen, finden Sie es nicht über Ihre Entität wissen, und geben Sie eine Ausnahme.

Was Sie tun müssen, ist Ihre Abfrage so zu konstruieren, dass das Bit, das in der Datenbank ausgeführt wird (dh bevor Sie aufzählen) keinen Verweis auf Ihre Entitäten enthält, nachdem Sie (durch Zu welcher Uhrzeit die Ergebnisse gespeichert und von der Datenbank getrennt werden, können Sie die Entität erstellen.

Versuchen Sie, die folgenden ...

var queryAllUsers = (from ru in db.rpm_usr 
        join ei in db.emp_info on ru.wwid equals ei.wwid 
        let cdis_eml = ei.dmn_addr + ";" 
        where ru.inact_ind == "N" && ei.inact_ind == "N" && ei.dmn_addr != null 
        orderby ei.dmn_addr 
        select ru) 
        .ToList() 
        .Select(ru => new rpm_scrty_rpm_usr { 
         usr_id = ru.usr_id, 
         usr_lnm = ru.usr_lnm, 
         usr_pwd = ru.usr_pwd, 
         usr_fnm = ru.usr_fnm, 
         wwid = ru.wwid, 
         apprvr_wwid = ru.apprvr_wwid, 
         chg_dtm = ru.chg_dtm, 
         chg_usr_id = ru.chg_usr_id, 
         dflt_ste_id = ru.dflt_ste_id, 
         cre_dtm = ru.cre_dtm, 
         cre_usr_id = ru.cre_usr_id, 
         lst_pwd_chg_dtm = ru.lst_pwd_chg_dtm, 
         lst_accs_dtm = ru.lst_accs_dtm, 
         email_id = ru.email_id, 
         inact_ind = ru.inact_ind, 
         salt = ru.salt, 
         tel = ru.tel 
        }; 

Wie Sie sehen können, gibt es keine Erwähnung Ihrer Einheiten in den Klammern ist, also wenn ToList() aufgerufen wird, wird die Datenbank nicht haben Problem. Sie erstellen dann die Entität im Speicher.

Der obige Code basiert auf der Tatsache, dass es für mich aussieht, als ob Sie nur ru als Ergebnis Ihrer Abfrage auswählen.Wenn Sie Daten von verbundenen Entitäten benötigen, müssen Sie zwei Auswahlvorgänge ausführen, einen wie zuvor (jedoch ohne Bezug auf die Entität) und einen weiteren nach dem Aufruf von ToList(), um die Entität zu erstellen.

Übrigens scheint die Zeile let cdis_eml = ei.dmn_addr + ";" nicht benötigt zu werden, so dass Sie sie entfernen könnten.

Hoffe, dass hilft. Da ich nicht mit Ihrer Datenbankstruktur vertraut bin, ist es schwer zu wissen, ob dies genau das ist, was Sie wollen. Wenn Sie weitere Fragen haben, können Sie gerne antworten.

+0

Ich folge dir nicht auf diesem einen? –

+0

@MillRunner Ich habe meine Antwort aktualisiert und Code hinzugefügt. Entschuldigung, ich habe ein Tablet benutzt, als ich die erste Antwort eingegeben habe, und es ist ein Schmerz, diesen Code zu schreiben! Ich hoffe, das macht mehr Sinn. –