[英]How to efficiently use expressions to prevent Entity Framework from error The specified type member is not supported in LINQ to Entities
[英]Entity Framework 4,1 code first, error The specified type member ENDESC_CEP is not supported in LINQ to Entities
我首先使用Entity Framework 4.1代碼,要執行以下搜索,將向我返回錯誤消息:LINQ to Entities不支持指定的類型成員ENDESC_CEP。 僅支持初始化程序,實體成員和實體導航屬性。這在參數qunado SCEP時發生。 即使當參數SCEP step時,也不會加載地址數據。 誰能告訴我該怎么辦? 感謝您的幫助。
using (SecurityCtx ctx = new SecurityCtx())
{
ctx.Configuration.LazyLoadingEnabled = true;
var query = ctx.Escola.Include("UnidadeFederativa").Include("Municipio").Include("EnderecoEscolas").Where(p => p.ID_EMPRESA == IdEmpresa);
if ( (!String.IsNullOrEmpty(sUF) ) && (sUF != "ZZ") )
{
query = query.Where(p => p.UnidadeFederativa.UF_SIGLA == sUF);
}
if (!String.IsNullOrEmpty(sMunicipio))
{
query = query.Where(p => p.Municipio.MUN_DESCRICAO.Contains(sMunicipio.Trim()));
}
if ( ! String.IsNullOrEmpty( sNome ) )
{
query = query.Where(p => p.ESCOLA_NOME.Contains(sNome.Trim()));
}
if ( ! String.IsNullOrEmpty( sCodigo) )
{
query = query.Where(p => p.ESCOLA_CODIGO.Contains(sCodigo.Trim()));
}
if (!String.IsNullOrEmpty(sEndereco))
{
query = query.Where(p => p.EnderecoEscolas.ToList().Select( item => item.ENDESC_ENDERECO.Contains( sEndereco.Trim() ) ).First() );
}
if (!String.IsNullOrEmpty(sBairro))
{
query = query.Where(p => p.EnderecoEscolas.ToList().Select( item => item.ENDESC_BAIRRO.Contains( sBairro.Trim() ) ).First() );
}
if (!String.IsNullOrEmpty(sCEP))
{
query = query.Where(p => p.ENDESC_CEP.Contains(sCEP) );
}
query = query.OrderBy( p => p.ESCOLA_NOME.Trim() ).ToList().Select(item => new Escola
{
ESCOLA_ID = item.ESCOLA_ID,
ID_EMPRESA = item.ID_EMPRESA,
ESCOLA_CODIGO = item.ESCOLA_CODIGO,
ESCOLA_NOME = item.ESCOLA_NOME,
ESCOLA_CNPJ = item.ESCOLA_CNPJ,
ESCOLA_E_MAIL = item.ESCOLA_E_MAIL,
ESCOLA_URL = item.ESCOLA_URL,
ESCOLA_NOME_FANTASIA = item.ESCOLA_NOME_FANTASIA,
ESCOLA_UF_ID = item.ESCOLA_UF_ID,
ESCOLA_MUNICIPIO_ID = item.ESCOLA_MUNICIPIO_ID,
ESCOLA_REDE_ID = item.ESCOLA_REDE_ID,
ESCOLA_LOCAL_ID = item.ESCOLA_LOCAL_ID,
STATUS_MUNICIPIO_ID = item.STATUS_MUNICIPIO_ID,
CODIGO_NIVEL_SE_ID = item.CODIGO_NIVEL_SE_ID,
CODIGO_PER_PLA_DIDATICO_ID = item.CODIGO_PER_PLA_DIDATICO_ID,
CODIGO_PER_PLA_PARADIDATICO_ID = item.CODIGO_PER_PLA_PARADIDATICO_ID,
ESCOLA_ORIGEM_DADOS_ID = item.ESCOLA_ORIGEM_DADOS_ID,
ESCOLA_ATIVA = item.ESCOLA_ATIVA,
ESCOLA_DATA_CADASTRAMENTO = item.ESCOLA_DATA_CADASTRAMENTO,
ESCOLA_DATA_ATUALIZACAO = item.ESCOLA_DATA_ATUALIZACAO,
UF_SIGLA = item.UnidadeFederativa.UF_SIGLA,
UF_DESCRICAO = item.UnidadeFederativa.UF_DESCRICAO,
MUN_DESCRICAO = item.Municipio.MUN_DESCRICAO,
ENDESC_ENDERECO = item.ENDESC_ENDERECO,
ENDESC_NRO = item.ENDESC_NRO,
ENDESC_CEP = item.ENDESC_CEP ,
ENDESC_COMPL = item.ENDESC_COMPL ,
ENDESC_BAIRRO = item.ENDESC_BAIRRO
}).AsQueryable();
return query;
道:
[Table("CAD_ESCOLAS")]
public class Escola
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ESCOLA_ID { get; set; }
[Required]
public int ID_EMPRESA { get; set; }
[ForeignKey("ID_EMPRESA")]
public virtual Empresa Empresa { get; set; }
[StringLength(10), Required]
[MinLength(8)]
public string ESCOLA_CODIGO { get; set; }
[StringLength(120), Required]
[MinLength(20)]
public string ESCOLA_NOME { get; set; }
[StringLength(20)]
public string ESCOLA_CNPJ { get; set; }
[StringLength(120)]
public string ESCOLA_E_MAIL { get; set; }
[StringLength(120)]
public string ESCOLA_URL { get; set; }
[StringLength(80)]
public string ESCOLA_NOME_FANTASIA { get; set; }
[Required]
public int ESCOLA_UF_ID { get; set; }
[ForeignKey("ESCOLA_UF_ID")]
public virtual UnidadeFederativa UnidadeFederativa { get; set; }
[Required]
public int ESCOLA_MUNICIPIO_ID { get; set; }
[ForeignKey("ESCOLA_MUNICIPIO_ID")]
public virtual Municipio Municipio { get; set; }
[Required]
public int ESCOLA_REDE_ID { get; set; }
[ForeignKey("ESCOLA_REDE_ID")]
public virtual RedeEnsino RedeEnsino { get; set; }
[Required]
public int ESCOLA_LOCAL_ID { get; set; }
[ForeignKey("ESCOLA_LOCAL_ID")]
public virtual TipoLocalizacao TipoLocalizacao { get; set; }
[Required]
public int STATUS_MUNICIPIO_ID { get; set; }
[ForeignKey("STATUS_MUNICIPIO_ID")]
public virtual StatusMunicipio StatusMunicipio { get; set; }
[Required]
public int CODIGO_NIVEL_SE_ID { get; set; }
[ForeignKey("CODIGO_NIVEL_SE_ID")]
public virtual NivelSocioEconomico NivelSocioEconomico { get; set; }
[Required]
public int CODIGO_PER_PLA_DIDATICO_ID { get; set; }
[ForeignKey("CODIGO_PER_PLA_DIDATICO_ID")]
public virtual PerPlanDidatico PerPlanDidatico { get; set; }
[Required]
public int CODIGO_PER_PLA_PARADIDATICO_ID { get; set; }
[ForeignKey("CODIGO_PER_PLA_PARADIDATICO_ID")]
public virtual PerPlanParadidatico PerPlanParadidatico { get; set; }
[Required]
public int ESCOLA_ORIGEM_DADOS_ID { get; set; }
[ForeignKey("ESCOLA_ORIGEM_DADOS_ID")]
public virtual OrigemDadosEsc OrigemDadosEsc { get; set; }
[Required]
public bool ESCOLA_ATIVA { get; set; }
[Required]
public DateTime ESCOLA_DATA_CADASTRAMENTO { get; set; }
[Required]
public DateTime ESCOLA_DATA_ATUALIZACAO { get; set; }
[NotMapped]
public String UF_SIGLA { get; set; }
[NotMapped]
public String UF_DESCRICAO { get; set; }
[NotMapped]
public String MUN_DESCRICAO { get; set; }
[NotMapped]
public String ENDESC_ENDERECO { get; set; }
[NotMapped]
public String ENDESC_NRO { get; set; }
[NotMapped]
public String ENDESC_CEP { get; set; }
[NotMapped]
public String ENDESC_COMPL { get; set; }
[NotMapped]
public String ENDESC_BAIRRO { get; set; }
public virtual ICollection<EnderecoEscola> EnderecoEscolas { get; set; }
public Escola()
{
EnderecoEscolas = new HashSet<EnderecoEscola>();
}
}
namespace DAL
{
[Table("CAD_ENDERECO_ESCOLA")]
public class EnderecoEscola
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ENDESC_ID { get; set; }
[Required]
public int ESCOLA_ID { get; set; }
[ForeignKey("ESCOLA_ID")]
public virtual Escola Escola { get; set; }
[Required]
public int TPOEND_ID { get; set; }
[ForeignKey("TPOEND_ID")]
public virtual TipoEndereco TipoEndereco { get; set; }
[Required]
public int ENDESC_UF_ID { get; set; }
[ForeignKey("ENDESC_UF_ID")]
public virtual UnidadeFederativa UnidadeFederativa { get; set; }
[Required]
public int ENDESC_MUN_iD { get; set; }
[ForeignKey("ENDESC_MUN_iD")]
public virtual Municipio Municipio { get; set; }
[StringLength(10), Required]
[MinLength(8)]
public string ENDESC_CEP { get; set; }
[StringLength(100), Required]
[MinLength(10)]
public string ENDESC_ENDERECO { get; set; }
[StringLength(15)]
public string ENDESC_NRO { get; set; }
[StringLength(25)]
public string ENDESC_COMPL { get; set; }
[StringLength(70)]
public string ENDESC_BAIRRO { get; set; }
}
}
ks
我需要在Grid實體的School和與之相關的實體(即UnidadeFederativa,Municipio和EscolaEnderecos)中顯示數據,如下所示:
select a.ESCOLA_NOME,
c.UF_SIGLA,
d.MUN_DESCRICAO,
b.ENDESC_ENDERECO,
b.ENDESC_BAIRRO
from CAD_ESCOLAS a,
CAD_ENDERECO_ESCOLA b,
CAD_UNIDADE_FEDERATIVA c,
CAD_MUNICIPIO d
where a.ESCOLA_UF_ID = c.UF_ID and
a.ESCOLA_MUNICIPIO_ID = d.MUN_ID and
b.ESCOLA_ID = a.ESCOLA_ID and
b.ENDESC_CEP like '03138%'
order by 1
我僅使用[notmapped]屬性來呈現從各個相關實體返回的相同數據記錄。
事實是,我無法訪問實體EscolaEnderecos的屬性,在何處應用條件,我可以引入恢復數據EscolaEnderecos,僅恢復第一條記錄,而不能恢復所有滿足條件的WHERE子句,如下所示:
item.EnderecoEscolas.Select (p => p.ENDESC_ENDERECO). First ()
簡而言之,我不能在條款中EnderecoEscola訪問該屬性的地方,也不能為從學校實體返回的每條記錄帶來EnderecoEscola數據。
如果有人可以指導我,我將非常感激。
ks
我需要在Grid實體的School和與之相關的實體(即UnidadeFederativa,Municipio和EscolaEnderecos)中顯示數據,如下所示:
select a.ESCOLA_NOME,
c.UF_SIGLA,
d.MUN_DESCRICAO,
b.ENDESC_ENDERECO,
b.ENDESC_BAIRRO
from CAD_ESCOLAS a,
CAD_ENDERECO_ESCOLA b,
CAD_UNIDADE_FEDERATIVA c,
CAD_MUNICIPIO d
where a.ESCOLA_UF_ID = c.UF_ID and
a.ESCOLA_MUNICIPIO_ID = d.MUN_ID and
b.ESCOLA_ID = a.ESCOLA_ID and
b.ENDESC_CEP like '03138%'
order by 1
我僅使用[notmapped]屬性來呈現從各個相關實體返回的相同數據記錄。
事實是,我無法訪問實體EscolaEnderecos的屬性,在何處應用條件,我可以引入恢復數據EscolaEnderecos,僅恢復第一個記錄,而不恢復所有滿足條件的WHERE子句,如下所示:item.EnderecoEscolas.Select( p => p.ENDESC_ENDERECO)。 第一()
簡而言之,我不能在條款中EnderecoEscola訪問該屬性的地方,也不能為從學校實體返回的每條記錄帶來EnderecoEscola數據。
如果有人可以指導我,我將非常感激。
ks
您的屬性Escola.ENDESC_CEP
被標記為[NotMapped]
屬性,這表示該屬性未持久化並且不代表數據庫中的列。 但是您正在LINQ to Entities查詢中使用它: query.Where(p => p.ENDESC_CEP.Contains(sCEP) );
代表通過此類(不存在)列進行的數據庫查詢過濾。 這是不可能的,並且會導致異常。
似乎您正在執行.Select並將檢索到的查詢信息投影到映射的類中。 這不是我以前見過的事情,因此我不建議這樣做。 它可以在您的應用程序的其他地方工作嗎?
如果您有[NotMapped]
東西,那么我會在其中放入一個實現,所以...
[NotMapped]
public String UF_SIGLA { get; set; }
會變成(您需要添加null檢查)
[NotMapped]
public String UF_SIGLA { get { return item.UnidadeFederativa.UF_SIGLA; } }
並像這樣使用:
query = query.OrderBy( p => p.ESCOLA_NOME.Trim() ).ToList()
對每個投影屬性執行此操作應消除進行完整投影的需要,並且可能會開始起作用,這也可能會澄清錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.