2017-10-12 4 views
0

J'écris une recherche de balise en C# MVC, mais je ne peux obtenir que tous les résultats qui ont l'un des mots. - La sortie doit être seulement là où tous les mots d'entrée correspondent, et exclure si par ex. 2 mots sont dans l'entrée, mais un seul correspond.Linq SQL Search - Des balises avec plus de correspondances

Mon code à ce jour:

List<String> list = Request["tags"].Split(' ').ToList(); 
KDBEntities q = new KDBEntities(); 

var query = (from tag in q.KDB_tags join question in q.KDB_questions on tag.question_id equals question.id where list.Any(x => x.Equals(tag.tag)) select question); 
var Rquery = query.GroupBy(x => x.id).Select(grp => grp.FirstOrDefault()).ToList(); 


return View(Rquery); 

J'ai essayé de comprendre cela pour un certain temps, mais pas de chance.

J'espère que cela a du sens et que vous pouvez m'aider.

+0

Avez-vous essayé d'utiliser Tout au lieu de Tout? – Rob

+0

Oui - Si vous utilisez Tout au lieu de Tout, je n'obtiens aucun résultat si vous saisissez plus d'un mot. – MadsBinger

+0

Pouvez-vous nous en dire un peu plus sur le modèle de KDB_questions et de KDB_tags. – Rob

Répondre

1

Balises liste:

List<TagObj> tags = new List<TagObj>() 
{ 
    new TagObj() { Id = 1, QuestionId = 1, Tag = "news" }, 
    new TagObj() { Id = 2, QuestionId = 1, Tag = "sports" }, 
    new TagObj() { Id = 3, QuestionId = 1, Tag = "famous" }, 
    new TagObj() { Id = 4, QuestionId = 2, Tag = "news" }, 
    new TagObj() { Id = 5, QuestionId = 2, Tag = "sports" }, 
    new TagObj() { Id = 6, QuestionId = 3, Tag = "news" }, 
    new TagObj() { Id = 7, QuestionId = 4, Tag = "funny" }, 
}; 

Liste des questions:

List<QuestionObj> questions = new List<QuestionObj>() 
{ 
    new QuestionObj(){ QuestionId = 1, Question = "Whats up footballers?" }, 
    new QuestionObj(){ QuestionId = 2, Question = "These are famous news?" }, 
    new QuestionObj(){ QuestionId = 3, Question = "Read all about it?" }, 
    new QuestionObj(){ QuestionId = 4, Question = "You know whats funny?" } 
}; 

Ce sont des balises entrants de la demande:

var incomingTags = new List<string>() { "news", "sports" }; 

Ce sont les requêtes:

var query = from t in tags 
       join q in questions on t.QuestionId equals q.QuestionId 
       where incomingTags.Contains(t.Tag) 
       select new { question = q, tag = t }; 

    var result = query. 
     GroupBy(g => g.question.QuestionId). 
     Where(g => g.ToList().Select(l => l.tag.Tag).SequenceEqual(incomingTags)). 
     Select(s => s.First().question).ToList(); 
+0

J'obtiens cette erreur à la variable résultat lors de l'exécution; System.NotSupportedException: 'LINQ to Entities ne reconnaît pas la méthode' Boolean SequenceEqual [String] (System.Collections.Generic.IEnumerable'1 [System.String], System.Collections.Generic.IEnumerable'1 [System.String]) 'méthode, et cette méthode ne peut pas être traduite en une expression de magasin.' – MadsBinger

+0

Aaaah oui. Je pense que c'est juste la méthode Linq2Objects donc ça ne se traduit pas bien par Linq2Entites. Dans la deuxième requête commence par var résultat = query.ToList() .... – Rob

+0

Cela fonctionne maintenant. - Merci beaucoup! – MadsBinger