Как читать свойства NotMapped в EF 5?

Я не могу понять, как получить доступ к свойству, помеченному как NotMapped, чтобы я мог его распечатать. Когда я пытаюсь получить к нему доступ, я получаю

Член указанного типа «LinkAddress» не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, члены сущностей и свойства навигации сущностей.

мой запрос LINQ:

(from n in db.Navigation
                                  join s in db.Sections on n.SectionID equals s.SectionID
                                  join sl in db.Locale_Sections on s.SectionID equals sl.SectionID
                                  where n.Category == "Books" && sl.CultureID == 1
                                  select new
                                  {
                                      s.LinkAddress,
                                      sl.Title,
                                  }).ToList();

мой контекст для раздела:

    [Table("Section")]
public class Section
{
    [Key, Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Int16 SectionID { get; set; }

    public Int64 LogoFileID { get; set; }

    [ForeignKey("LogoFileID")]
    public virtual File File { get; set; }

    [Required, MaxLength(15), Column(TypeName = "varchar")]
    public string RouteName { get; set; }

    [Required, MaxLength(15), Column(TypeName = "varchar")]
    public string Type { get; set; }

    public virtual ICollection<Locale_Section> Translations { get; set; }

    [NotMapped]
    public string LinkAddress
    {
        get
        {
            return Type + "/" + RouteName;
        }
    }
}

person Community    schedule 02.03.2013    source источник


Ответы (1)


Поскольку он не отображается, его нельзя использовать в запросе... вам необходимо материализовать объект, прежде чем вы сможете получить доступ к свойству...

var materialised = (from n in db.Navigation
     join s in db.Sections on n.SectionID equals s.SectionID
     join sl in db.Locale_Sections on s.SectionID equals sl.SectionID
     where n.Category == "Books" && sl.CultureID == 1
     select new
     {
          s,
          sl.Title,
     }).ToList()

// This bit is done in CLR
return materialised.Select(m => new 
{
    m.s.LinkAddress,
    m.Title
});

В качестве альтернативы вы можете внести свою логику в запрос, который действителен...

(from n in db.Navigation
 join s in db.Sections on n.SectionID equals s.SectionID
 join sl in db.Locale_Sections on s.SectionID equals sl.SectionID
 where n.Category == "Books" && sl.CultureID == 1
 select new
 {
     LinkAddress = s.Type + "/" + s.RouteName,
     sl.Title,
 }).ToList()
person Felix    schedule 03.03.2013
comment
Спасибо, что я не использовал ваше альтернативное решение, так как оно меньше кода и чище для чтения. - person ; 03.03.2013