Linq 쿼리가 엔티티를 던지거나 linq에서 엔티티로 복합 유형을 생성 할 수 없습니다. select new {..}를 사용하여 클래스 이름을 제거하더라도

user5299399

다음과 같은 기사를 읽고있었습니다. 오류 : LINQ to Entities 쿼리에서 엔터티 또는 복합 형식을 생성 할 수 없습니다.

그래서 나는 내 쿼리에서 select new rpm_scrty_rpm_usr{..다음으로 변경해야한다고 수집 합니다.select new { ...

그런 다음 오류 메시지에서 이동합니다.

  • ex { "엔티티 또는 복합 형식 'ConAppTester.rpm_scrty_rpm_usr'은 LINQ to Entities 쿼리에서 생성 할 수 없습니다."} System.Exception {System.NotSupportedException}

대신 컴파일하지 않고

오류 3 System.Collections.Generic.List <AnonymousType # 1> 형식을 System.Collections.Generic.List <ConAppTester.rpm_scrty_rpm_usr> C : \ dev \ RLISAdmin \ ConAppTester \ DbMethods.cs 51 11 ConAppTester로 암시 적으로 변환 할 수 없습니다.

방법

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;
}

컨텍스트 참조

private RPMContext db = new RPMContext();

컨텍스트 파일

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

조금

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; }
}

기타 포코

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; }
}
Avrohom Yisroel

문제는 오류 메시지에서 알 수 있듯이 L2E가 엔터티에 대해 알지 못한다는 것입니다. 작동 방식은 쿼리를 열거 할 때까지 아무 일도 일어나지 않는 것입니다. 귀하의 경우에는 ToList ()를 호출하면됩니다. 이 시점에서 데이터베이스는 쿼리를 시도하고 실행하고 엔터티에 대해 알지 못하는 것을 발견하고 예외를 제공합니다.

해야 할 일은 데이터베이스에서 실행되는 비트 (즉, 열거 전)에 엔티티에 대한 참조가 포함되지 않는 방식으로 쿼리를 구성한 다음, 열거 한 후 (결과가 메모리에 있고 데이터베이스에서 분리됨) 엔티티를 만들 수 있습니다.

다음을 시도하십시오 ...

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
                     };

보시다시피 대괄호 안에 엔티티에 대한 언급이 없으므로 ToList ()가 호출되면 데이터베이스에 문제가 없습니다. 그런 다음 메모리에 엔티티를 만듭니다.

위의 코드는 ru쿼리의 결과로 선택하는 것처럼 보이는 사실을 기반으로합니다 . 관련 엔터티의 데이터가 필요한 경우 이전과 같이 (그러나 엔터티에 대한 참조없이) 하나를 선택하고 엔터티를 만들기 위해 ToList ()를 호출 한 후 하나를 선택해야합니다.

그건 그렇고, 라인 let cdis_eml = ei.dmn_addr + ";"은 필요하지 않은 것 같으므로 제거 할 수 있습니다.

도움이되기를 바랍니다. 귀하의 데이터베이스 구조에 대해 잘 모르기 때문에 이것이 정확히 원하는 것인지 알기 어렵습니다. 더 궁금한 점이 있으면 언제든지 답장 해주세요.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관