2012-02-23 2 views
0

Je suis un peu nouveau dans LINQ et Entity Framework, donc des requêtes SQL assez simples me causent un mal de tête. J'ai un écran de saisie utilisateur qui leur permet de sélectionner des valeurs d'entrée et la requête qui en résulte dépend des valeurs entrées par l'utilisateur. Les groupes de requêtes résultant les résultats à présenter une liste de clients uniquesLinq faisant un groupe dans un sous-groupe lambda

table design simplifié - Un client peut être dans de nombreux États

client
CustomerId
Nom
JoinDate

État
StateId
CustomerId

Ainsi, l'utilisateur doit entrer un nom de client sur l'écran pour déclencher la requête, mais l'état est un champ facultatif, donc ma requête doit être un peu dynamique dans le code. La LINQ de base, je l'ai écrit est assez simple

dim cust = from c in ctx.Customer 
where c.Name = InputFromScreen 
Select c.CustomerId, c.Name, c.JoinDate, C.State 

Maintenant que j'ai une requête LINQ de base, je peux utiliser des expressions lambda pour réduire davantage le queryset, en fonction de l'entrée de l'écran (ajoutez ANDs à l'endroit).

Exemple: Si l'utilisateur est entré dans une valeur pour le champ Date d'inscription:
cust = cust.Where(Function(c) c.JoinDate = DateFromScreen)

Cependant, je ne peux pas comprendre comment ajouter le cas/Groupe pour l'État puisque l'État est une navigation, pas une table Le SQL pour cela serait plutôt simple (et ce n'est pas optimal, mais l'ajout des AND pour chaque élément à l'écran est le moyen le plus simple à l'exemple)
select c.customerid, c.name
from customer c
where c.name = 'input' and c.JoinDate = 'input' and
c.customerid in (select customerid from state where state = 'IN')

Je pense que c'est assez simple.

Répondre

1

LINQ aux entités équivalentes à votre requête SQL serait:

var customers = from c in ctx.Customer 
       where c.States.Any(s=> s.State == "IN") 
       select new { c.CustomerId, c.Name }; 

Cela suppose que vous avez une propriété de navigation States sur votre entité Customer. (Ci-dessus est la syntaxe C#, je suis sûr que VB est quelque peu similaire)