LINQ LEFT JOIN, объединить несколько предложений WHERE с помощью OR - PullRequest
2 голосов
/ 23 июня 2011

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) ИЛИ ([t1]. [uid] = 2))

Как добавить два условия в виде

ГДЕ ([t0]. [Gid] = 0) ИЛИ (([t1]. [Uid] = 1) ИЛИ ([t1]. [Uid] = 2))

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Спасибо,

Может ли PredicateBuilder генерировать предикаты, охватывающие несколько таблиц?

Теперь у меня есть решение, которое работает, но мой набор результатов основан на новом гибридном классе. В результате мне пришлось отразить все соответствующие поля. Смотри ниже.

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);
0 голосов
/ 01 сентября 2011

Вместо нескольких предложений Or, почему бы просто не сделать Contains. Таким образом, ваш список идентификаторов может быть полностью динамическим (если он не превышает 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); 
0 голосов
/ 23 июня 2011
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...