none
Linq + entity framework RRS feed

  • Вопрос

  • Добрый день...подскажите пожалуйста...есть код:

     public class RodMList : List<RODM>
        {
            //Entities pp = new Entities();
            public RodMList(PlanProdContext pp)
            {
                foreach (RODM em in (from e1 in pp.RODMs orderby e1.RM select new { RM = e1.RM, NAIM = e1.NAIM + "(" + e1.NAIM2 + ")", NAIM2 = e1.NAIM2, NN = e1.NN, DIR_SPR_NOM = e1.DIR_SPR_NOM }))
                    base.Add(em);
            }
        }

    вылазит ошибка:

    Преобразование типа "AnonymousType#1" в "TestDotOracle.RODM" невозможно

    вот сам сгенерированный EDM ADO.NET класс RODM:

    public partial class RODM 
        {
            public RODM()
            {
                this.DIR_SPR_NOM = new HashSet<DIR_SPR_NOM>();
            }
    
            public string RM { get; set; }
            public string NAIM { get { return NAIM; } set { NAIM = value; } }
            public string NAIM2 { get; set; }
            public Nullable<int> NN { get; set; }
        
            public virtual ICollection<DIR_SPR_NOM> DIR_SPR_NOM { get; set; }
        }

    не могу понять...без проекции всё отрабатывает:

    from e1 in pp.RODMs orderby e1.RM select

    а мне надо с проекцией...что надо сделать люди добрые подскажите))???


    Олег

    23 апреля 2013 г. 9:48

Ответы

  • Метод базового класса List<RODM>  Add() ожидает параметр типа RODM, вы же делаете проекцию данных (вызовом select new {...})и передаете туда именно AnonymousType. 

    Зачем в коде вообще проекция, вы же просто перечисляете в ней все свойства класса RODM?

    Если нужен именно 

    NAIM = e1.NAIM + "(" + e1.NAIM2 + ")"
    То вызов перепишите как base.Add(new RODM {RM = em.RM, <... остальные свойства ...> })
    • Изменено J.W.Harding 23 апреля 2013 г. 10:48
    • Предложено в качестве ответа YatajgaModerator 24 апреля 2013 г. 10:08
    • Помечено в качестве ответа Soa137 25 апреля 2013 г. 2:14
    23 апреля 2013 г. 10:46
  • Есть, можно воспользоваться возможностями partial классов. У вас класс именно такой. Добавляете в проект еще один файл с классом, изменяете его сигнатуру на аналогичную вашему классу и пишите свойства которые вам нужны. Например, можно добавить вот такой класс:

    public partial class RODM 
    {
        public string FullNAIM
        {
           get
           {
              return NAIM + NAIM2;
           }
        }     
    }

    • Предложено в качестве ответа YatajgaModerator 24 апреля 2013 г. 10:08
    • Помечено в качестве ответа YatajgaModerator 3 мая 2013 г. 13:46
    24 апреля 2013 г. 9:41
    Отвечающий

Все ответы

  • Метод базового класса List<RODM>  Add() ожидает параметр типа RODM, вы же делаете проекцию данных (вызовом select new {...})и передаете туда именно AnonymousType. 

    Зачем в коде вообще проекция, вы же просто перечисляете в ней все свойства класса RODM?

    Если нужен именно 

    NAIM = e1.NAIM + "(" + e1.NAIM2 + ")"
    То вызов перепишите как base.Add(new RODM {RM = em.RM, <... остальные свойства ...> })
    • Изменено J.W.Harding 23 апреля 2013 г. 10:48
    • Предложено в качестве ответа YatajgaModerator 24 апреля 2013 г. 10:08
    • Помечено в качестве ответа Soa137 25 апреля 2013 г. 2:14
    23 апреля 2013 г. 10:46
  • Спасибо за совет...но а как мне делать вычисляемые поля...например типа всяких условий case или if и т.д...я так понимаю в проекции их можно реализовать...или ещё есть способы...???

    Олег

    24 апреля 2013 г. 5:33
  • Есть, можно воспользоваться возможностями partial классов. У вас класс именно такой. Добавляете в проект еще один файл с классом, изменяете его сигнатуру на аналогичную вашему классу и пишите свойства которые вам нужны. Например, можно добавить вот такой класс:

    public partial class RODM 
    {
        public string FullNAIM
        {
           get
           {
              return NAIM + NAIM2;
           }
        }     
    }

    • Предложено в качестве ответа YatajgaModerator 24 апреля 2013 г. 10:08
    • Помечено в качестве ответа YatajgaModerator 3 мая 2013 г. 13:46
    24 апреля 2013 г. 9:41
    Отвечающий
  • Спасибо всем за ответы..)))

    Олег

    25 апреля 2013 г. 2:14