2010-12-14 36 views
0

J'essaie d'utiliser Linq pour créer un objet qui contient lui-même 2 objets de données. À partir de l'expression Linq, j'essaie de configurer les objets directement plutôt que d'avoir une fonction inbetween dans la classe contenant.Linq pour plusieurs objets utilisant MVC

La classe contenant ressemble à ceci:

public class SupplierCategories 
{ 

    public category _category; 
    public category_sub _category_sub; 
    private bool _IsActive; 
    private int? _SupplierID; 

    public SupplierCategories() 
    { 

    } 

    public bool IsActive 
    { 
     get 
     { 
      return _IsActive; 
     } 
     set 
     { 
      _IsActive = value; 
     } 
    } 

    public int? SupplierID 
    { 
     get 
     { 
      return _SupplierID; 
     } 
     set 
     { 
      _SupplierID = value; 
      if (_SupplierID != null) // The county is active if there is a supplier ID matching 
      { 
       _IsActive = true; 
      } 
     } 

    } 
} 

Note: catégorie et objets category_sub sont tous mis en place par l'Entity Framework.

lien Mon expression a 2 tables et ressemble à ceci:

public IEnumerable<SupplierCategories> GetAllOrdered() 
    { 
     IEnumerable<SupplierCategories> areaList; 

     var results = from cat in dbContext.categories 
         join sub in dbContext.category_sub on cat.id equals sub.categoryid 
         orderby cat.id ascending, sub.name ascending 
         select new SupplierCategories 
         { 
          _category = { new category { cat.id, cat.name } }, 
          _category_sub = { new category_sub { sub.id, sub.categoryid, sub.name } } 
         }; 

     areaList = results.ToList(); 

     return areaList; 
    } 

Espérons que vous pouvez voir que je suis en train de créer le « _category » et objets « _category_sub » directement.

L'erreur que je reçois est:

Erreur 5 Impossible d'initialiser le type 'Essential_Collections.Models.category' avec un initialiseur de collection car il ne met pas en œuvre 'System.Collections.IEnumerable' D : \ Websites \ Essential Collections \ development \ build \ Essential Collections \ Modèles \ SupplierCategories \ SupplierCategoriesRepository.cs 51 37 Collections essentielles

Toute solution ou peut-être d'autres approches seraient reçues avec reconnaissance

Répondre

1

Essayez de supprimer les accolades supplémentaires ainsi:

public IEnumerable<SupplierCategories> GetAllOrdered() 
{ 
    IEnumerable<SupplierCategories> areaList; 

    var results = from cat in dbContext.categories 
        join sub in dbContext.category_sub on cat.id equals sub.categoryid 
        orderby cat.id ascending, sub.name ascending 
        select new SupplierCategories() 
        { 
         _category = cat, 
         _category_sub = sub 
        }; 

    areaList = results.ToList(); 

    return areaList; 
} 
+0

Merci beaucoup, fonctionne très bien. Cependant, si je voulais créer des objets qui ne correspondent pas directement aux tables, pourrais-je faire quelque chose comme ci-dessus en spécifiant des valeurs individuelles? – Billyhomebase

+0

@Billyhomebase: @BFree souligne où vous vous trompiez avec vos constructeurs d'objets pour category et category_sub. Si vous avez un constructeur approprié ou si vous identifiez correctement les propriétés que vous initialisez, vous pouvez instancier de nouveaux objets pour ceux-ci. – Lazarus

+0

Si cela "fonctionne bien", je suggère de l'accepter comme la réponse. –

1

Vous avez manqué les paranthèses sur l'appel du constructeur:

select new SupplierCategories() 
{ 
0
public IEnumerable<SupplierCategories> GetAllOrdered() 
{ 
    IEnumerable<SupplierCategories> areaList; 

    var results = from cat in dbContext.categories 
        join sub in dbContext.category_sub on cat.id equals sub.categoryid 
        orderby cat.id ascending, sub.name ascending 
        select new SupplierCategories 
        { 
         _category = new category { cat.id, cat.name } , //removed the curly braces here 
         _category_sub = new category_sub { sub.id, sub.categoryid, sub.name } //removed the curly braces here 
        }; 

    areaList = results.ToList(); 

    return areaList; 
} 

L'erreur que vous obtenez est à cause de ces accolades j'ai enlevé . Cela encore ne compilera pas parce que vous devez énoncer explicitement quelle propriété vous définissez dans le initialiseur d'objet:

_category = new category { ID = cat.id, Name = cat.name } 

ou si votre classe de catégorie a une surcharge de constructeur qui prend les args, puis passer ceux.