寻找LINQ中的重叠利益

Mik*_*yer 6 c# linq-to-entities entity-framework

我有一个模型,其中一个地方有一些描述,这些描述与兴趣(place.description.interests)相关联.查看场所视图的用户在模型中表示为用户,其也具有许多兴趣.

我想要做的是按重叠的兴趣(包括零重叠)对描述进行排序,我目前的Linq是:

place dest = (from p in _db.places
                          where p.short_name == id
                          select p).Single();

 return View(dest);
Run Code Online (Sandbox Code Playgroud)

现在,以下将在SQL中对所讨论的模式执行我想要的操作:

SELECT COUNT(interest_user.user_id) AS matches, description.*
FROM description JOIN interest_description ON description.user_id = interest_description.user_id AND description.place_id = interest_description.place_id
    JOIN interest ON interest_description.interest_id = interest.interest_id
    LEFT JOIN interest_user ON interest.interest_id = interest_user.interest_id 
WHERE interest_user.user_id = 2
    AND description.place_id = 1
GROUP BY interest_description.user_id, interest_description.place_id
ORDER BY matches DESC
Run Code Online (Sandbox Code Playgroud)

但我对Linq来说太新了,不知道如何正确处理这个问题.理想情况下,我可以在传递强类型模型时将其拉下来.

到目前为止我已经设法了:

var desc = from d in _db.descriptions
                       from i in d.interests
                       from u in i.users.DefaultIfEmpty()
                       where d.place_id == PlaceID
                           && (u.user_id == userID
Run Code Online (Sandbox Code Playgroud)

(PlaceID和UserID是传递给管理它的控制器的参数).

简单地说,鉴于这个linq,我只需要返回d,按照i的数量排序.

我的模特 在此输入图像描述

Muh*_*hid 3

当您的 linq 查询变得过于复杂时,我建议您在数据库中创建视图并将它们放在 dbml 设计器上。我经历过几种情况,在 linq 查询中进行大量分组会导致 sql 效率低下。使用视图不仅会产生直接的 linq 查询,而且还会使用您想要的 sql。