используя PredicateBuilder внутри выбора - PullRequest
3 голосов
/ 08 апреля 2011

Я создаю функцию специального отчета для своего приложения.Я использовал PredicateBuilder для части «Где», но теперь, когда я пытаюсь использовать его также внутри части «Выбрать», у меня ничего не получается.

Пример кода:

   IQueryable<User> usersQuery = db.Users.AsQueryable();

    var where = PredicateBuilder.True<User>();
    //sample for the users query
    where = where.And(p => p.Enabled);


    var selectOrders = PredicateBuilder.True<UserOrder>();
    //sample for a query inside user orders
    selectOrders = selectOrders.And(p => p.Amount > 10);

    usersQuery = usersQuery.Where(where); //work
    var query = (from a in usersQuery
         select new
                {
                FirstName = a.FirstName,
                TotalOrders = a.UserOrders.Where(selectOrders).Count() //could not compile                                                                                               
                }).AsQueryable();

Я не думаю, что вы можете сделать

.Select("new (TotalOrders = UserOrders.Where(BetAmount > @0).Count()")

В DynamicLinq, но я не могу его использовать, потому что я вызываю некоторые пользовательские функции sql внутри «select», а DynamicLinq не поддерживает его.

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

Я думаю, что проблема здесь заключается в том, что Linq to SQL не поддерживает подзапросы, которые потребуются вашим запросом.Вот почему навигационные свойства UserOrders в вашем случае не реализуют IQueryable и запросы к нему не могут быть выполнены.

Я могу ошибаться.Но это доказывает, что я прав: http://blog.robustsoftware.co.uk/2009/01/why-linq-to-sql-is-not-proper-orm.html

Вы должны использовать лучше ORM, как Entity Framework.

0 голосов
/ 08 апреля 2011

Как насчет такого обходного пути? Вы изменили условие соединения согласно вашей схеме

var where = PredicateBuilder.True<User>();
//sample for the users query
where = where.And(p => p.Enabled);

var selectOrders = PredicateBuilder.True<UserOrder>();
//sample for a query inside user orders
selectOrders = selectOrders.And(p => p.Amount > 10);

var usersQuery = from u in db.Users.Where(where)
                 join o in db.UserOrders.Where(selectOrders) 
                        on u.UserId equals o.UserId
                 group o by u into groupedOrders
                 select new
                 {
                    FirstName = groupedOrders.Key.FirstName,
                    TotalOrders = groupedOrders.Count()                                                                                              
                 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...