Добавление предложения where/order by в IQueryable

у меня есть функция ths для запроса набора записей из БД:

public IQueryable<PointTransactionViewModel> GetPointTransactions(int UserID)
        {
            return
                (
                    from PointTransaction p in entities.PointTransaction
                    join ActivityLog a in entities.ActivityLog
                    on p.TransactionID equals a.TransactionID
                    where p.UserID == UserID
                    select new PointTransactionViewModel
                    {
                        ID = p.TransactionID,
                        Balance = p.Balance,
                        Points = p.Amount,
                        RelatedActivityID = a.ID,
                        When = p.When,
                        Sender = p.SenderUserInfo.CompleteName
                    }
                );
        }

Я хочу добавить дополнительную причину, как это

var entries = GetPointTransaction(1);
return entries.OrderbyDescending.Where( x => x.When >= start && w.When <= end).
               ( x => x.When);

однако мне, похоже, нужно создать новый запрос из существующего, чтобы это сработало. Но, мне кажется, эта работа раньше без создания нового запроса, в фрагменте кода раньше:

 public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            PageSize = pageSize;
            TotalCount = source.Count();
            TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);

            this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
        }

как-то код выше не нуждается в создании нового запроса для исходного объекта IQueryable? Был временным объектом создан?

редактировать

Это странно, но, чтобы заставить его работать, я должен сделать следующее:

IQueryable<ActivityLogEntry> log = activityRepo.GetPointTransaction(userID).
   Where(x => x.PointsEarned == 50);
return log.ToList();

следующее не будет работать:

var log =  = activityRepo.GetPointTransaction(userID);
log.Where( x => x.PointsEarned == 50);
return log.ToList();

нет сообщения об ошибке, просто предложение where кажется игнорируемым (оно также возвращает все данные, которые PointsEarned не 50)

4 ответов


код entries является переменной IQueryable, поэтому этого достаточно, и вы можете добавить любое количество предложений перед выборкой данных (как и раньше ToList()). Он не запускается, будет создано только дерево выражений, пока вы не получите данные.

var query = context.Where(x=>x.id == test);
query = query.Where(anotherCondition1);
query = query.Where(anotherCondition2);
...
var result = query.ToList();

равен

var result = context.Where(x=>x.id == test).Where(anotherCondition1)
                    .Where(anotherCondition2)....ToList()

посмотреть LINQ и отложенное исполнение


Я имею в виду, вы можете написать этот пример :

opportunites =  from opp in oppDC.Opportunities
join org in oppDC.Organizations on opp.OrganizationID equals org.OrgnizationID
select new
                        {
                            opp.OpportunityID,
                            opp.Title,
                            opp.PostedBy,
                            opp.Address1,
                            opp.CreatedDate,
                            org.OrganizationName
                        };
if(condition)
{
   opportunites  = opportunites.Where(opp => opp.Title.StartsWith(title));
}
//------Other Condition you need
if(!String.IsNullOrEmpty(title))
{
    opportunites  = opportunites.Where(.....);
}

if(!String.IsNullOrEmpty(name))
{
    opportunites  = opportunites.Where(.....);
} 

вам нужно создать новый объект. IQueryable является неизменным. Не волнуйтесь, это то, как вы должны это сделать. Именно так формируются запросы. Все методы расширения, такие как" где", фактически не изменяют объект. Они просто возвращают новый.

код, который работает, не должен работать. У метода даже нет типа.


Как уже упоминалось, вам не нужен новый объект. Ваш синтаксис OrderByDescending неверно, хотя вам нужно указать селектор клавиш.

var entries = GetPointTransaction(1); 
return entries.Where(x => x.When >= start && w.When <= end).OrderbyDescending(x => x.When);