EF(LINQ to SQL) - 如何查询?

时间:2015-01-07 08:16:50

标签: c# linq entity-framework

我有一个包含关键字/ s的文档的概念。 EF将document-keyword连接表抽象为关联。

结构看起来像这样

Document: ID (PK)

Document_Keyword: DocumentID (PK), Keyword (PK) 

Keyword: Keyword (PK)

我要求在string[]

中返回包含所有关键字的文档列表

如果我在SQL中这样做,它将类似于下面的

with t as (
    select 'keyword1' KEYWORD  union
    select 'keyword2'    
)
select DocumentID,count(*) from  [dbo].[Document_Keyword] p
inner join t on p.KEYWORD = t.KEYWORD
group by DocumentID
having count(*) = (select count(*) from t)

我很难形成linq查询,这会给我相同的结果。

我已尝试过以下LINQ语句,但它会返回包含数组中一个或多个关键字的文档。我要求只有在所有关键字匹配时才会返回文档。

var query = (from k in db.KEYWORD
                                     from b in k.DOCUMENT                                        
                                     join q in arrKeywords //array of string[]
                                        on k.KEYWORD equals q                              
                                     select new Document()
                                       {
                                           Filename = b.FILENAME,
                                           Description = b.TITLE                                               
                                       });

有什么想法吗? 干杯 杰里米

1 个答案:

答案 0 :(得分:0)

如果我能帮到你,你想要所有关键词完全匹配的词条,即它没有任何其他关键词。一种实现这一目标的方法是

var kwc = arrKeywords.Count();

var query = from k in db.KEYWORD
            let kw = k.DOCUMENT.Select(d => d.KEYWORD)
            where kw.All(kw1 => arrKeywords.Contains(kw1))
               && kw.Count() == kwc;                                    

生成的查询仍然比手工编码的查询长得多,但我认为数据库的查询优化器应该能够处理这个问题。