我一直在寻找堆栈溢出,但没有一个答案似乎完全解决了这个问题。我得到的错误是:
无法使用集合初始值设定项初始化类型'mvcTest.Models.MakeModelSpec',因为它没有实现'System.Collections.IEnumerable'
我创建了一个这样的新类型来克服匿名类型错误
public class MakeModelSpec
{
public int MakeId { get; set; }
public string Name { get; set; }
}
public IQueryable<MakeModelSpec> GetSpecs(int makeid)
{
var searchspec = from spec in db.Specs
join model in db.Models on spec.ModelID equals model.ModelID
join make in db.Makes on model.MakeID equals make.MakeId
select new MakeModelSpec
{
make.MakeId,
spec.Name,
};
if (makeid != -1)
{
searchspec = searchspec.Where(make => make.MakeId == makeid);
}
return searchspec;
}
如果有人能指出我正确的方向,我将非常感谢我使用MVC c#和sql server db
答案 0 :(得分:2)
您正在使用集合初始值设定项初始化您的MakeModelSpec
“。
List<Item>
等集合可以初始化为
new List<Item>
{
Item1,
Item2
}
您的代码被解释为尝试这样做,因为它不提供对象初始化所需的参数
new MakeModelSpec
{
Make = make.MakeId,
Name = spec.Name
}
请注意,如果您使用的是匿名类型,可以执行对象初始化而不指定参数名称。
new
{
make.MakeId,
spec.Name
}
上述不被解释为集合初始值设定项的唯一原因是该类型是匿名的,因此您可以随时编写属性名称。因此,您用于创建对象的属性名称可以推断。
因此,在以下示例中,Name =
是多余的,因为该属性无论如何都会被称为Name
,但Id =
不多余,因为导致匿名类型具有名为Id
而不是MakeId
的属性,如果您没有提供名称,它将推断出该属性:
new
{
Id = make.MakeId,
Name = spec.Name
}
如果MakeModelSpec
要实施IEnumerable
,那么它实际上是某个东西的集合,那么你就可以做到
new MakeModelSpec
{
MakeModelSpec1,
MakeModelSpec2
}
...前提是MakeModelSpec1
和-2
属于MakeModelSpec#Add
接受的类型。这就是编译器认为你要做的事情。