在c# 4.0中实现IEnumerable

本文关键字:实现 IEnumerable | 更新日期: 2023-09-27 18:13:52

我有这样一个类:

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'

有什么帮助吗?

在c# 4.0中实现IEnumerable

您必须正确分配属性或使用构造函数:

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

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

更改初始化器,当前使用的语法用于集合初始化器,而不是对象初始化器:

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不一样。

BrokenGlass回答了你的detail初始化问题,但我想再添加一件关于你使用Disposable模式的事情。考虑这样编码:

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(); 
    }
}

Using将调用cs.Dispose(),即使你的查询抛出。

另一个想法-考虑像这样输入你的函数…

public IList<Detail> Getinfo()

如果您使用不同类型的ilist -实现者,或者更好:

public IEnumerable<Detail> Getinfo()

在不需要ilist的情况下更灵活

您正在混合两种形式的初始化之间,您可以使用构造函数,像这样:

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

或者在默认构造之后使用属性初始化,如下所示:

new Detail { CId = p.CId, StateInstanceDate = p.InstanceDate, StateName = p.StateName }
select new Detail(p.CId, p.InstanceDate, q.StateName);

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

我认为这与这里的section有关:

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

您可能需要使用父括号而不是括号

using System.Web.UI.WebControls;使用Trirand.Web.Mvc;

输入代码

名称空间样本。模型{公共类PersonalModel{公共int PersonID{获取;设置;}公共字符串LastName{获取;设置;}公共字符串FirstName{获取;设置;}公共字符串地址{get;设置;}公共字符串城市{获取;设置;}公共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;            
    }
}

}

您忘记在new Detail后面加上(),然后您必须分配像CId = p.d d…