2010-08-17 9 views
0

J'ai un problème avec Linq dans VB.NET. J'ai créé un fichier .dbml à partir de mon db, et tout semble bien - relation "flèches" entre les tables sont visibles, etcTable liée à Linq erreur non-interrogeable

Mais quand je veux utiliser une requête simple (tiré de 101 échantillons Linq par MS) :

Dim q = From h In dc.Hours, w In h.WorkType 

Je reçois une erreur:

Expression of type 'INTegrity.WorkType' is not queryable. Make sure you are not missing an assembly reference and/or namespace import for the LINQ provider.

h.Worktype est visible dans IntelliSense ...

Je peux joindre manuellement dans la requête Linq, mais les relations ne devraient-elles pas être automatiques?

La requête complète qui fonctionne, mais en utilisant « manuel joint » ressemble à ceci:

Dim q1 = From g In dc1.Hours _ 
Join pr In dc1.WorkType On g.WorkTypeId Equals pr.WorkTypeId _ 
Where g.WorkerId = workerid _ 
Select New With {g.EntryId, g.Date, pr.WorkTypeDesc, g.Minutes} 

table Worktype a 1 à plusieurs avec table Heures (comme vous pouvez le voir sur la colonne WorkTypeId)

+0

Linq en VB est étranger à moi, mais je suis très familier avec LINQ en C#. Il ne semble pas que vous fassiez quelque chose avec cette requête. Est-ce que vous essayez d'écrire une jointure? Où est votre sélection? – jsmith

+0

L'erreur est affichée lorsque j'écris la première ligne, je ne parviens même pas à sélectionner. Et oui, je voudrais faire une jointure en utilisant les informations de relation du fichier .dbml. – ufoq

Répondre

2

Je ne parle pas LINQ en VB, donc je vais essayer d'adapter à C#

From h In dc.Hours, w In h.WorkType 

from h in dc.Hours 
from w in h.WorkType 
..... 

Cela implique que WorkType est une collection qui son nom ne suggère pas. Je pense que vous voulez quelque chose de plus proche de

from h in dc.Hours 
let w = h.WorkType 
.... 

Bien sûr, aucun de ceux-ci rien faire sans les pièces du « .... ». Si vous nous montrez ce que vous voulez faire là-bas, nous pourrions probablement le réparer pour vous.

Mise à jour # 1:

Essayer de rassembler ce que vous faites, nous allons deviner que les heures & WorkType sont des tables avec un à-plusieurs (WorkType sur le côté « un »), donc toutes les heures record matches un enregistrement WorkType. Dans ce cas, Linq-to-SQL génère automatiquement une propriété WorkType scalaire en heures. Vous n'avez pas besoin de "from ... in" pour y accéder. C'est juste une propriété, utilisez-la directement là où vous en avez besoin.

MISE À JOUR # 2: (D'après les commentaires) Je pense que cela devrait fonctionner:

Dim q1 = 
From g In dc1.Hours 
Where g.WorkerId = workerid 
Select New With {g.EntryId, g.Date, g.WorkType.WorkTypeDesc, g.Minutes} 
+0

C'est encore plus simple que je ne le pensais. Merci James! – ufoq

Questions connexes