LINQ-与OR条件连接

LINQ-与OR条件连接,linq,entity-framework,Linq,Entity Framework,我有两个实体,用户和友谊,看起来像: public class User { public int UserId { get; set; } (...) } public class Friendship { public int SenderId { get; set; } public int ReceiverId { get; set; } (...) }

我有两个实体,用户和友谊,看起来像:

    public class User
    {
        public int UserId { get; set; }
        (...)
    }

    public class Friendship
    {
         public int SenderId { get; set; }
         public int ReceiverId { get; set; }
         (...)
    }
    SELECT * FROM Users as U
    INNER JOIN Friendships as F ON U.UserId = F.ReceiverId OR U.UserId = F.SenderId
    Where U.Nick != VARIABLE
我想创建一个简单的查询,在SQL中如下所示:

    public class User
    {
        public int UserId { get; set; }
        (...)
    }

    public class Friendship
    {
         public int SenderId { get; set; }
         public int ReceiverId { get; set; }
         (...)
    }
    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的这种查询效率不高。

LINQ中的联接总是等联接。基本上,您需要多个
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 ...;
现在在LINQtoObjects中,可能有更有效的方法来实现这一点,但我希望基于SQL的LINQ提供程序能够生成具有足够好的执行计划的查询。它实际上可能不会在SQL中创建联接,但我希望它的执行计划与您显示的联接相同。

只需编写:

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};

@JoeTuskan它将进行内部连接。(检查queryplan)我使用的是实体框架核心,这会导致交叉连接,而不是内部连接join@jonmeyer:但是仍然给出与等效内部联接相同结果的交叉联接?正如我在回答中所说的那样,这不会让我感到惊讶。