2011-11-10 75 views
0

该模型包含2个具有多对多关系的实体:CatalogueItems and Keywords实体框架多对多选择

假设2个变量定义:

ObjectQuery<Keyword> KW; 
ObjectQuery<CatalogueItem> CI; 

KW包含选择一组关键字的一些查询。我需要CI选择至少有一个来自KW的关键字的所有CatalogueItems。

一件重要的事情:什么都不应该预先计算或枚举。关键字枚举需要很长时间,但UI基于实时CatalogueItems显示。一个完美的事情就是让CI准备好执行。

回答

0

事情是这样的:

from catalogueItem in CI 
from keyword in KW 
where catalogueItem.Keywords.Contains(keyword) 
select catalogueItem 

编辑: 使KW不会每次计算,尝试这样做:

var keywords = KW.ToList() 
from catalogueItem in CI 
from keyword in keywords 
where catalogueItem.Keywords.Contains(keyword) 
select catalogueItem 

否则,我需要看到该查询KW和你的整个数据库能够知道如何优化查询。

另一种选择是简单地编写一个存储过程并将其与实体框架进行映射。

+0

谢谢。 它的工作原理,但tooooooo缓慢。用于提取关键字的单个查询需要几秒钟。 此查询正在运行...我不知道。我一直保持10分钟,并关闭它。看起来它为每个CatalogueItem重新计算KW。 此外,CatalogueItems在结果中重复。 Distinct()完全没有帮助 - app在合理的时间内挂起并没有结果。 我相信应该有一个更优化的方式。 – Sergey40a

+0

请参阅我的编辑。 – Svarog

+0

查询就像“keyword.Value like @ 0 or keyword.Value like @ 1 ...”。数据库有一个用于建立多对多关系的过渡表(ItemID,KeywordID)。索引是好的。 也许SP是一个更好的方式来实现这...可惜 – Sergey40a

0
context.CatalogueItems.Where(ci=> ci.Keywords.Where(cik=>KW.Any(cik))); 

这样的事情?请检查语法。

+0

有什么问题:(它不明白“cik”在最内部的括号内。 – Sergey40a