在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'
有什么帮助吗?
您必须正确分配属性或使用构造函数:
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…