2010-12-06 4 views
0

J'ai essayé d'utiliser la suggestion fournie ici pour utiliser l'opérateur In dans linq, mais je ne suis pas capable de convertir mes exigences en instructions LINQ.Dans l'opérateur dans Linq

Ci-dessous la requête SQL que je dois convertir en Linq

select * 
from navigator_user_field_property 
where user_id = 'albert' 
and field_id in (
     select field_id 
     from navigator_entity_field_master 
     where entity_id = 1 
     and use_type = 0) 
order by field_id 

Je veux que ce soit converti en un efficace Linq.

La plupart des réponses traitent de la liste de chaînes de caractères prédéterminée qui ne fonctionne pas dans mon cas.

Merci

Répondre

2

On dirait un me joindre:

var query = from navigator in db.NavigatorUserFieldProperties 
      where navigator.UserId == "albert" 
      join field in db.NavigatorEntityFieldMasters 
          .Where(f => f.EntityId == 1 && f.UseType == 0) 
      on navigator.FieldId equals field.FieldId 
      select navigator; 

Notez que ce retour la même valeur à plusieurs reprises s'il y a plusieurs champs avec le même ID - mais je soupçonne que ce n'est pas le cas .

Vous pouvez faire une traduction plus littérale comme ceci:

var query = from navigator in db.NavigatorUserFieldProperties 
      where navigator.UserId == "albert" && 
       db.NavigatorEntityFieldMasters 
        .Where(f => f.EntityId == 1 && f.UseType == 0) 
        .select(f => f.FieldId) 
        .Contains(navigator.FieldId) 
      select navigator; 

... et que peut finir par traduire la même SQL ... mais je serais personnellement aller avec la jointure .

1

Voici une requête LINQ efficace et lisible:

var fields = 
    from field in db.navigator_entity_field_masters 
    where field.entity_id == 1 && field.user_type == 0 
    select field; 

var properties = 
    from property in db.navigator_user_field_properties 
    where property.user_id == "albert" 
    where fields.Contains(property.field) 
    select property; 

mama Look !! Sans jointures ;-)

+0

Il existe une raison pour laquelle des jointures existent au niveau SQL. Je peux me tromper, mais cela pourrait potentiellement conduire à des performances dégénérées dans le cas où seule une (petite) fraction des enregistrements extraits correspondrait réellement. Si tel est le cas, alors "efficace" devrait être préfacé avec les conditions. –

+2

@pst: Je ne pense pas que vous compreniez LINQ (sur les arborescences d'expression). Lorsque vous pensez que tous les champs sont extraits de la base de données, vous avez tort. LINQ to SQL transformera ceci en une requête très performante (et unique). Notez également que LINQ to SQL transformera cette requête en une requête SQl avec des jointures, et est capable de le faire en raison des métadonnées du modèle généré. – Steven