我有两个实体,用户和友谊,如下所示:
public class User
{
public int UserId { get; set; }
(...)
}
public class Friendship
{
public int SenderId { get; set; }
public int ReceiverId { get; set; }
(...)
}
我想创建一个简单的查询,在SQL中看起来像:
SELECT * FROM Users as U
INNER JOIN Friendships as F ON U.UserId = F.ReceiverId OR U.UserId = F.SenderId
Where U.Nick != VARIABLE
换句话说,我想选择用户的所有朋友。
我无法做到这一点。我找到了一个解决方案,其中一个用union创建了两个单独的连接查询,并且它可以工作 - 但是向db创建这样的查询效率不高。
答案 0 :(得分:4)
LINQ中的联接始终是equijoins。基本上,您需要多个from
子句和where
子句:
var query = from u in db.Users
where u.Nick != variable
from f in db.Friendships
where u.UserId == f.ReceiveId || u.UserId == f.SenderId
select ...;
现在在LINQ to Objects中可能有更有效的方法 - 但是我希望基于SQL的LINQ提供程序能够生成一个具有足够好的执行计划的查询。它实际上可能不会在SQL中创建JOIN,但我希望它与您显示的连接是相同的执行计划。
答案 1 :(得分:1)
简单地写一下:
from U in db.Users
from F in Friendships.Where(x => U.UserId == F.ReceiverId || U.UserId == F.SenderId)
where U.Nick != VARIABLE
select new {u, f};