将where/order by子句添加到IQueryable

Ext*_*kun 6 c# linq

我有这个函数从DB查询一组记录:

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
                    }
                );
        }
Run Code Online (Sandbox Code Playgroud)

我希望增加一个额外的原因,像这样

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

但是,我似乎需要从现有的查询创建一个新查询才能使用.但是,在以前的代码片段中,我似乎没有创建新查询,这似乎是这项工作:

 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));
        }
Run Code Online (Sandbox Code Playgroud)

以上代码是否不需要为IQueryable源对象创建新查询?是否创建了临时对象?

编辑

这很奇怪,但为了让它工作,我必须做以下事情:

IQueryable<ActivityLogEntry> log = activityRepo.GetPointTransaction(userID).
   Where(x => x.PointsEarned == 50);
return log.ToList();
Run Code Online (Sandbox Code Playgroud)

以下内容不起作用:

var log =  = activityRepo.GetPointTransaction(userID);
log.Where( x => x.PointsEarned == 50);
return log.ToList();
Run Code Online (Sandbox Code Playgroud)

没有错误消息,只是忽略了where子句(它还返回了PointsEarned不是50的所有数据)

Sae*_*iri 14

你entries是一个IQueryable变量,所以它足够了,你可以在获取数据之前添加任意数量的子句(如前所述ToList()).它不会运行,只会创建表达式树,直到您获取数据.

var query = context.Where(x=>x.id == test);
query = query.Where(anotherCondition1);
query = query.Where(anotherCondition2);
...
var result = query.ToList();
Run Code Online (Sandbox Code Playgroud)

它等于

var result = context.Where(x=>x.id == test).Where(anotherCondition1)
                    .Where(anotherCondition2)....ToList()
Run Code Online (Sandbox Code Playgroud)

请参阅LINQ和延迟执行