LINQ to SQL – Problème de design de database

Je suis assez nouveau pour travailler sur les bases de données en général, et j'espère get vos conseils quant à ce qui n'a pas fonctionné.

J'ai 4 tables à scope de main, actuellement configurées de cette façon:

entrez la description de l'image ici

Company – Juste une table Company ordinaire avec certaines données dedans

Company_GoodsPackaging – Un tableau de reference pour la société, où l'information sur QUEL type de marchandises que la société «fait» et quel type d'emballage, pour ce bien, est fait.

GoodsType – Fondamentalement une énumération, les valeurs sont maintenant:

1 Commodity

2 Aliments pour humains et animaux

3 Animaux vivants

4 plantes

5 Cargaison spéciale

6 Exceptionnel

PackagingType – Également un enum, valeurs:

1 colis

2 palette

3 Conteneur

4 en vrac

5 surdimensionné

CODE

Dans mon code-behind de mon site Web ASP.NET, je suis en train de faire ce qui suit:

Je parcoure toutes les valeurs GoodsType et j'essaie de voir si CompanyX (un object de la société LINQ) a cette valeur dans sa table, et si oui, quelle est la Packaging_Type.Description de la valeur.

Le problème que j'ai maintenant, c'est que quand j'ai mon object Company, je ne semble pas capable d'extraire ses membres.

var theSource = (from g in Data.GoodsTypes select new { gvGoodsType = g.Description, gvParcels = true, gvContainers = curCompany.Company_GoodsPackagings.GoodsType == g.Goods_Type && curCompany.Company_GoodsPackagings.PackagingType1.Description == "Container" } 

Les relations sont terminées, tout semble correct, mais je ne peux pas sembler pouvoir extraire les GoodsType et PackagingType d'une input Company_GoodsPackaging. Je sais que c'est un EntitySet.

Où ma design de DataBase est-elle défectueuse / La logique du code est-elle défectueuse? Je dois dire que je suis tout nouveau à travailler dans DataBases. Toute aide / consortingbution serait la bienvenue.

Erreur que je reçois dans VS

Erreur 26 'System.Data.Linq.EntitySet' ne contient pas de définition pour 'GoodsType' et aucune méthode d'extension 'GoodsType' acceptant un premier argument de type 'System.Data.Linq.EntitySet' n'a été trouvée (il vous manque un en utilisant une directive ou une reference d'assembly?) ***** \ Account \ MyAccountTransport.aspx.cs 33 8

Le problème est que curCompany.Company_GoodsPackagings est une collection de GoodsPackagings (d'où le pluriel et la mention de System.Data.Linq.EntitySet ). Vous ne pouvez donc pas vous référer directement à un seul GoodsType pour la Société de cette manière.

Je pense que vous cherchez un moyen de tester chacun des GoodsPackagings de la Société par rapport à vos conditions. Pour ce faire, vous pouvez utiliser la méthode d'extension Any() Linq:

 using System.Linq; ... gvContainers = curCompany.Company_GoodsPackagings.Any(gp => gp.GoodsType == g.Goods_Type && gp.PackagingType1.Description == "Container") 

Si je ne me trompe pas, Company -> Company_GoodsPackagings est une relation de un à plusieurs?

Par conséquent, la propriété Copmany_GoodsPackagings sera une collection et vous devrez donc utiliser la fonction Any () comme suit:

 var theSource = (from g in Data.GoodsTypes select new { gvGoodsType = g.Description, gvParcels = true, gvContainers = curCompany.Company_GoodsPackagings.Any(gp => qp.GoodsType == g.Goods_Type && gp.PackagingType1.Description == "Container") } 

EDIT : Il semble que ma suggestion d'utiliser Any () n'est pas supscope par Linq to SQL. Par conséquent, je suggérerais que vous rameniez l'object de l'set des marchandises et que vous vérifiiez ensuite s'il avait une valeur ou non afin de déterminer les objects gvContainers booleans:

Vous pouvez ensuite convertir votre type anonyme en une class concrète et append la propriété à la fin de l'exemple:

 var theSource = (from g in Data.GoodsTypes select new GoodsResult { gvGoodsType = g.Description, gvParcels = true, gvGoodsPackaging_Container = curCompany.Company_GoodsPackagings.FirstOrDefault(gp => qp.GoodsType == g.Goods_Type && gp.PackagingType1.Description == "Container") } public bool gvContainers { get { return this.gvGoodsPackaging != null } }