Реализация IEnumerable в C # 4.0 - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть этот класс:

public class Detail
{
    public Detail() { }
    public Detail(Guid Id, DateTime InstanceDate, string Name)
    {
        CId = Id;
        StateInstanceDate = InstanceDate;
        StateName = Name;
    }

    public Guid CId { get; set; }
    public DateTime StateInstanceDate { get; set; }
    public string StateName { get; set; }
}

и вот как я пытаюсь получить доступ к данным с помощью LINQ:

public List<Detail> Getinfo()
{
    CaseContext cs = new CaseContext();
    var query = (from p in cs.table1    
                join q in cs.table2  
                 on p.StateKey equals q.StateKey 
                 select new Detail
                 {
                     p.CId,
                     p.InstanceDate,
                     q.StateName
                 }).ToList<Detail>();

    cs.Dispose();
    return query;
}

Но я получаю эту ошибку,

Не удается инициализировать тип «Detail» с помощью инициализатора коллекции, поскольку он не реализует «System.Collections.IEnumerable»

Любая помощь?

Ответы [ 8 ]

8 голосов
/ 09 ноября 2011

Вы должны либо правильно назначить свойства, либо использовать конструктор:

select new Detail( p.CId, p.InstanceDate, q.StateName)

Или

select new Detail 
{
  CId = p.CId, 
  StateInstanceDate = p.InstanceDate, 
  StateName = q.StateName 
}
3 голосов
/ 09 ноября 2011

Измените свой инициализатор, синтаксис, который вы используете в настоящее время, предназначен для инициализатора коллекции, а не инициализатора объекта:

new Detail 
{ 
    CId = p.CId, 
    StateInstanceDate = p.InstanceDate, 
    StateName = p.StateName 
};

Или используйте другой конструктор:

new Detail(p.CId, p.StateInstanceDate, p.StateName);

Я думаю, что вы упали в том, что компилятор достаточно умен, чтобы обрабатывать что-то вроде:

new Detail
{
    p.CId,
    StateInstanceDate = p.InstanceDate,
    p.StateName
};

Путем вывода имен свойств через имена свойств типа источника. Обратите внимание, что вам нужно явно указать StateInstanceDate, потому что InstanceDate - это не то же самое.

0 голосов
/ 21 июля 2014

с использованием System.Web.UI.WebControls;используя Trirand.Web.Mvc;

введите здесь код

образец пространства имен sample.Models {открытый класс PersonalModel {public int PersonID {get;задавать;} публичная строка LastName {get;задавать;} публичная строка FirstName {get;задавать;} публичная строка Address {get;задавать;} публичная строка City {get;задавать;} public JQGrid OrdersGrid {get;задавать;}

    public PersonalModel()
    {            

        OrdersGrid = new JQGrid
                         {
                             Columns = new System.Collections.List()
                            {
                                 new JQGridColumn { DataField = "PersonId", 
                                                    // always set PrimaryKey for Add,Edit,Delete operations
                                                    // if not set, the first column will be assumed as primary key
                                                    PrimaryKey = true,
                                                    Editable = false,
                                                    Width = 50 },                                    
                                 new JQGridColumn { DataField = "FirstName", 
                                                    Editable = true,
                                                    Width = 100 },
                                 new JQGridColumn { DataField = "LastName",                                                         
                                                    Editable = true,
                                                    Width = 100, 
                                                    },
                                 new JQGridColumn { DataField = "Address", 
                                                    Editable = true,
                                                    Width = 75 },
                                 new JQGridColumn { DataField = "City",
                                                    Editable =  true
                                                  }                                     
                             },
                             Width = Unit.Pixel(640),
                             Height = Unit.Percentage(100)
                         };

        OrdersGrid.ToolBarSettings.ShowRefreshButton = true;            
    }

}

}

0 голосов
/ 09 ноября 2011

BrokenGlass ответил на ваш вопрос инициализации детали, но я хотел бы добавить еще одну вещь об использовании шаблона одноразового использования.Рассмотрим кодирование следующим образом:

public List<Detail> Getinfo()    
{  
    using (CaseContext cs = new CaseContext())
    {
        return (from p in cs.table1     
                join q in cs.table2   
                  on p.StateKey equals q.StateKey  
                  select new Detail 
                  ( 
                      p.CId, 
                      p.InstanceDate, 
                      q.StateName 
                  )
               ).ToList(); 
    }
}

Использование вызовет cs.Dispose (), даже если ваш запрос сгенерирован.

Еще одна мысль - подумайте над тем, чтобы напечатать свою функцию так ...

public IList<Detail> Getinfo()

в случае, если вы используете другой тип IList-разработчика или даже лучше:

public IEnumerable<Detail> Getinfo()

, который еще более гибок, если вам не нужны IList-ы.

0 голосов
/ 09 ноября 2011

Я думаю, что это связано с разделом здесь:

select new Detail
           { p.CId, p.InstanceDate, q.StateName }

Вы, вероятно, хотите использовать скобки вместо скобок.

0 голосов
/ 09 ноября 2011
select new Detail(p.CId, p.InstanceDate, q.StateName);

или

rselect new Detail 
{
    CId = p.CId, 
    StateInstanceDate = p.InstanceDate, 
    StateName = q.StateName 
};
0 голосов
/ 09 ноября 2011

Вы на полпути между двумя формами инициализации, вы можете использовать конструктор, например так:

new Detail(p.CId, p.InstanceDate, q.StateName)

Или использовать инициализацию свойства после конструкции по умолчанию, например:

new Detail { CId = p.CId, StateInstanceDate = p.InstanceDate, StateName = p.StateName }
0 голосов
/ 09 ноября 2011

Вы забыли поставить () после новой детализации, а затем вам нужно назначить свойства, такие как CId = p.CId ...

...