2010-08-20 2 views
1

Je travaille sur une application de nuage de tags. Il y a 3 tables de base de données.Utilisation de la clause 'Contient' comme Clause SQL 'IN' dans Entity Framework

Contenu: ContentID, texte

Tag: TagID, Nom

TagRelation: TagRelationID, TagID, ContentID

Le code ci-dessous est erroné. Parce que la clause 'Contient' ne prend pas une liste de paramètres comme la clause SQL 'IN'. Y a-t-il une autre clause que je peux utiliser pour faire fonctionner ce code?

 public List<Content> GetTagArticles(String tagName) 
    { 
     var relations = db.TagRelation.Where(t => t.Tag.Name == tagName).ToList(); 

     var contents = db.Content.Where(c => c.TagRelation.Contains(relations)).ToList(); 



     return contents.ToList(); 

    } 

Répondre

6

Effectuez les opérations suivantes:

var contents = db.Content.SelectMany(c => c.TagRelation).Where(tr => relations.Contains(tr)).ToList(); 
+0

Votre suggestion fonctionne. Merci. – gavss

+0

Mais pourquoi renvoie-t-il les TagRelations associées? – gavss

+0

Désolé, vous demandez pourquoi cela fonctionne? –

0

Probablement this Stackoverflow thread peut vous aider, au moins, je pense que vous êtes à la recherche de cette ...

Extrait du fil:

vous

pourrait implémenter votre propre méthode WhereIn:

public static IQueryable<TEntity> WhereIn<TEntity, TValue> 
(
    this ObjectQuery<TEntity> query, 
    Expression<Func<TEntity, TValue>> selector, 
    IEnumerable<TValue> collection 
) 
{ 
    if (selector == null) throw new ArgumentNullException("selector"); 
    if (collection == null) throw new ArgumentNullException("collection"); 
    ParameterExpression p = selector.Parameters.Single(); 

    if (!collection.Any()) return query; 

    IEnumerable<Expression> equals = collection.Select(value => 
     (Expression)Expression.Equal(selector.Body, 
     Expression.Constant(value, typeof(TValue)))); 

    Expression body = equals.Aggregate((accumulate, equal) => 
    Expression.Or(accumulate, equal)); 

    return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); 
} 

Utilisation:

public static void Main(string[] args) 
{ 
    using (Context context = new Context()) 
    { 
     //args contains arg.Arg 
     var arguments = context.Arguments.WhereIn(arg => arg.Arg, args); 
    } 
} 

Votre exemple (non testé): (et faire 2 requêtes :()

public List<Content> GetTagArticles(String tagName) 
{ 
    var relationIds = db.TagRelation.Where(t => t.Tag.Name == tagName).Select(t=>t.Id).ToList(); 

    var contents = db.Content.WhereIn(c => c.TagRelation.Id, relationIds>); 



    return contents.ToList(); 

}