2016-03-24 12 views
0

3 anahtar kelime, Ürün ve Anahtar KelimeÜrünüm var. I filtre deneyinlinq liste listemize uyan her şeyi içeriyor.

  • "", A ve B ürünleri iade
  • sadece B ürünü

, "matris" filtre dönmek deneyin ama "matris" filtrelerken Ben de B ve A alırım. Sadece B kaydına ihtiyacım var. kodu

:

var keywordTermList = ("the matrix").Split(' '); 

db.Products 
.Where(product => product.ProductKeywords.All(k => keywordTermList.Contains(k.Keyword.Name))) 

Kelime Tablo

 
+-----------+---------+ 
| KeywordId | Name | 
+-----------+---------+ 
|   1 | awakens | 
|   2 | force | 
|   3 | the  | 
|   4 | matrix | 
+-----------+---------+ 

ProductKeyword Tablo

 
+------------+-----------+ 
| KeywordId | ProductId | 
+------------+-----------+ 
| 3(the)  | A   | 
| 2(force) | A   | 
| 1(awakens) | A   | 
| 3(the)  | B   | 
| 4(matrix) | B   | 
+------------+-----------+ 

Ürün Tablo A ve B kaydı bulunur.

Bunun için nasıl giderim? "Matrisi" filtrelediğimde yalnızca B'yi nasıl alabilirim. Eğer alt küme tam surperset

var query = products.Where(p => !keywordListTerm.Except(p.ProductKeywords.Select(pk => pk.Name)).Any()); 

eşleştirmek istiyorsanız

+0

'var keywordTermList = searchString.Split ('') .Where (t =>! Ignore.Contains (t)) toList();' - 'ignore'' '' bir '' listesi "an", "the", ...} 've görmezden gelmek istediğiniz her şey. –

+0

Evet, biliyorum. Bu sadece örnek kayıtlar. – tsubasaetkisi

+0

Yukarıdakiler gerçek sorgunuz gibi görünmüyor, çünkü daha fazla veriyi (örneğin, B ürününün üçüncü kelimesi varsa) daha fazla kayıt döndürmekten daha çok filtrelemesi olasıdır. –

cevap

0

İşte tam ömeği bu yardımcı olur

public class Program 
{ 
    public static void Main(string[] args) 
    { 

     Product A = new Product(); 
     A.Name = "A"; 
     A.ProductKeywords = new List<Keyword>() { 
      new Keyword(){Name = "the"}, 
      new Keyword(){Name = "force"}, 
      new Keyword(){Name = "awakens"} 
     }; 

     Product B = new Product(); 
     B.Name = "B"; 
     B.ProductKeywords = new List<Keyword>() { 
      new Keyword(){Name = "the"}, 
      new Keyword(){Name = "matrix"} 
     }; 

     List<Product> products = new List<Product>() { A, B }; 

     var keywordListTerm = ("the force matrix").Split(' '); 

     var query = products.Where(p => !keywordListTerm.Except(p.ProductKeywords.Select(pk => pk.Name)).Any()); 

     foreach (var item in query) { 
      Console.WriteLine(item.Name); 
     } 

     Console.ReadKey(); 
    } 
} 

public class Product { 
    public string Name = string.Empty; 
    public List<Keyword> ProductKeywords; 
} 

public class Keyword 
{ 
    public string Name; 

} 

Umut olduğunu.

+0

Bu genel LINQ için teknik olarak doğru olsa da, "varlık-framework-6" etiketini fark edip etmediğinizi bilmiyorum, bu nedenle yukarıdaki SQL sorgusuna çevrilemez ve çalışma zamanı istisnasıyla başarısız olur. –

+0

Yanıt için teşekkürler. Bu benim için çalışıyor:) – tsubasaetkisi

+0

@IvanStoev Oh! Tüm LINQ'ın SQL'e başarılı bir şekilde çevrilemeyeceğini bilmiyordum. OP için nasıl çalıştığından emin değil. – vabii

İlgili konular