使用Linq根据另一个表中前5的内连接选择表

时间:2012-11-15 14:10:12

标签: linq linq-to-entities

我正在尝试根据另一个表中的前5个值从我的数据库中选择一个表并遇到障碍。

这是没有前5个值的版本:

from d in Deals
from f in FacebookUserCategories
from s in SubCategories
where s.FacebookCategoryId == f.FacebookCategoryId
&& f.FacebookUserId == 1437585390
orderby f.Count descending
select d

但是,我需要的是根据SubCategories表中的前5个Ids选择交易,这意味着我必须使用Take运算符。

以下linq将帮助我实现这一目标:

(from f in FacebookUserCategories
 from s in SubCategories
 where s.FacebookCategoryId == f.FacebookCategoryId
 orderby f.Count descending
 select s.Id).Take(5)

我是否还可以从这里选择具有SubCategoryId作为联接的Deals表?

回顾一下......我可以编写sql ..就像这样:

SELECT t1.* FROM Deal t1
INNER JOIN (
SELECT TOP 5 t2.Id FROM FacebookUserCategory , SubCategory t2
WHERE FacebookUserId = '1437585390'
AND FacebookUserCategory.FacebookCategoryId = t2.FacebookCategoryId 
ORDER BY Count DESC) tbl
ON t1.SubCategoryId = tbl.Id

1 个答案:

答案 0 :(得分:1)

试试这个,对所有3个表使用Join,仅使用Join表示2个表,为什么不在第3个表中使用Join

var result = from d in deals
             let top5Counts =
            (from f in FacebookUserCategories
             join s in SubCategories on f.FacebookCategoryId equals s.FacebookCategoryId
             where f.FacebookUserId == 1437585390
             orderby f.Count descending
             select s.Id).Take(5)
            where top5Counts.Contains(d.SubCategoryId.Value)
            select d;