Как вы используете LINQ для SQL объединить две таблицы и вернуть результат? - PullRequest
0 голосов
/ 14 июля 2010

Я смотрел на переполнение стека, но ни один из ответов, кажется, полностью не решает эту проблему. Я получаю ошибку:

Невозможно инициализировать тип «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 db

1 Ответ

2 голосов
/ 14 июля 2010

Вы инициализируете 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 принимает.Это то, что компилятор думает, что вы пытаетесь сделать.

...