0

J'ai été à la recherche sur le débordement de pile, mais aucune des réponses semblent résoudre complètement ce problème. L'erreur que je reçois est:Comment utiliser un linq pour sql rejoindre deux tables et renvoyer le résultat?

Impossible d'initialiser le type « mvcTest.Models.MakeModelSpec » avec un initialiseur de collection, car il ne met pas en œuvre « System.Collections.IEnumerable »

J'ai créé un nouveau type comme celui-ci pour obtenir sur l'erreur de type anonyme

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

Si quelqu'un peut me diriger dans la bonne direction, je serais très reconnaissant que je utilise MVC C# et un serveur sql db

Répondre

2

Vous initialisez votre MakeModelSpec "avec un initialiseur de collection ".

Collections telles que List<Item> peuvent être initialisés en tant que tels

new List<Item> 
{ 
    Item1, 
    Item2 
} 

Votre code est interprété comme essayer de le faire, car il ne fournit pas les paramètres, qui sont nécessaires pour l'initialisation objet

new MakeModelSpec 
{ 
    Make = make.MakeId, 
    Name = spec.Name 
} 

Notez que pouvez faire l'initialisation d'objet sans spécifier de nom de paramètre si vous utilisez des types anonymes.

new 
{ 
    make.MakeId, 
    spec.Name 
} 

La seule raison pour laquelle le non interprété ci-dessus comme initialiseur de collection est que le type est anonyme, de sorte que vous faites des noms de propriété que vous allez. Par conséquent, les noms de propriété que vous avez utilisés pour créer l'objet peuvent être inféré.

Par conséquent, dans l'exemple suivant, Name = est redondant, parce que la propriété serait appelé Name de toute façon, mais Id = est pas redondant, car cela provoque le type anonyme d'avoir une propriété appelée Id plutôt que MakeId qu'il serait déduire si vous n'êtes pas fournir de nom:

new 
{ 
    Id = make.MakeId, 
    Name = spec.Name 
} 

Si MakeModelSpec devaient mettre en œuvre IEnumerable, de sorte qu'il était en fait une collection de quelque chose, vous serait alors en mesure de faire

new MakeModelSpec 
{ 
    MakeModelSpec1, 
    MakeModelSpec2 
} 

... à condition que MakeModelSpec1 et -2 sont d'un type qui accepte MakeModelSpec#Add. C'est ce que le compilateur pense que vous essayez de faire.

+0

Cheers Mate qui m'a complètement trié – Kitemark76