我有这个函数从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和延迟执行
| 归档时间: |
|
| 查看次数: |
16882 次 |
| 最近记录: |