LINQ LEFT JOIN,将多个WHERE子句与OR组合

时间:2011-06-23 15:32:39

标签: c# sql linq

LINQ,

var clause = PredicateBuilder.False<User>();
clause = clause.Or(u => u.uid.Equals(1));
clause = clause.Or(u => u.uid.Equals(2));

var usersInGroup = (from u in db.Users
                    join g in db.GroupUsers
                        on u.uid equals g.uid
                        into ug
                    from g in ug.DefaultIfEmpty()
                    where g.gid.Equals(0)
                    select u).Where(clause);

这两个where子句被链接在一起;

WHERE([t0]。[gid] = 0) AND (([t1]。[uid] = 1)OR([t1]。[uid] = 2))

如何将条件中的两个添加为

WHERE([t0]。[gid] = 0) OR (([t1]。[uid] = 1)OR([t1]。[uid] = 2))

3 个答案:

答案 0 :(得分:2)

谢谢你,

Can PredicateBuilder generate predicates that span multiple tables?

我现在有一个可行的解决方案,但我的结果集基于一个新的混合类。因此,我不得不反映所有相关领域。见下文。

public class HybridGroupUser {
    private User _user;
    public User User {
        get { return _user; }
        set {
            _user = value;
            if (value != null) {
                uid = value.uid;
                fname = value.fname;
                lname = value.lname;
                email = value.email;
            }
        }
    }
    private GroupUser _GroupUser;
    public GroupUser GroupUser {
        get { return _GroupUser; }
        set {
            _GroupUser = value;
            if (value != null) {
                uid = value.uid;
                fname = value.fname;
                lname = value.lname;
                email = value.email;
            }
        }
    }

    public int? uid { get; set; }
    public string fname { get; set; }
    public string lname { get; set; }
    public string email { get; set; }
}

通过这门课,我现在可以做到以下几点;

var clause = PredicateBuilder.False<HybridGroupUser>();

clause = clause.Or(u => u.GroupUser.gid.Equals(0);
foreach (int i in AddedUsers) {
    int tmp = i;
    clause = clause.Or(u => u.User.uid.Equals(tmp));
}

var usersInGroup = (from u in db.Users
                    join gusr in db.GroupUser
                        on u.uid equals gusr.uid
                        into ug
                    from gusr in ug.DefaultIfEmpty()
                    select new HybridGroupUser {
                       User = u, 
                       GroupUser = gusr
                    }).Where(clause);

答案 1 :(得分:0)

var usersInGroup = (from u in db.Users
join g in db.Groups
on u.uid equals g.uid
where g.gid.Equals(0) || (u.uid.Equals(1) || u.uid.Equals(2))
select u)

答案 2 :(得分:0)

为什么不做包含,而不是做多个Or子句。这样你的ID列表就可以完全动态(只要它不超过2000):

var ids = new int[] {1, 2, 3}; 

var usersInGroup = (from u in db.Users 
                    join g in db.GroupUsers 
                        on u.uid equals g.uid 
                        into ug 
                    from g in ug.DefaultIfEmpty() 
                    where g.gid.Equals(0) 
                      && ids.Contains(u.uid)
                    select u);