你如何使用linq来连接两个表并返回结果?

时间:2010-07-14 11:59:20

标签: linq-to-sql model-view-controller join ienumerable anonymous-types

我一直在寻找堆栈溢出,但没有一个答案似乎完全解决了这个问题。我得到的错误是:

无法使用集合初始值设定项初始化类型'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

1 个答案:

答案 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接受的类型。这就是编译器认为你要做的事情。