다음과 같은 기사를 읽고있었습니다. 오류 : 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; }
}
문제는 오류 메시지에서 알 수 있듯이 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] 삭제
몇 마디 만하겠습니다