C# 将where/order by子句添加到IQueryable

C# 将where/order by子句添加到IQueryable,c#,linq,C#,Linq,我具有从数据库查询一组记录的功能: public IQueryable<PointTransactionViewModel> GetPointTransactions(int UserID) { return ( from PointTransaction p in entities.PointTransaction join Act

我具有从数据库查询一组记录的功能:

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
                    }
                );
        }

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

您的
条目是一个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()

请参见

您确实需要创建一个新对象。IQueryable是不变的。别担心,这是你应该做的。这就是查询在内部形成的方式。所有像“Where”这样的扩展方法实际上并没有改变对象。他们只是返回一个新的


您声称有效的代码不应该有效。该方法甚至没有类型。

正如其他人所指出的,您不需要新对象。但是,
OrderByDescending
的语法错误,需要指定键选择器

var entries = GetPointTransaction(1); 
return entries.Where(x => x.When >= start && w.When <= end).OrderbyDescending(x => x.When);
var entries=GetPointTransaction(1);
返回条目。其中(x=>x.When>=start&w.When x.When);

我的意思是您可以编写以下示例:

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(.....);
} 

它起作用了。这是一个通用方法,您必须指定类型。我设法让它工作,但我无法使用var来存储IQueryable对象。我已经更新了问题中的代码。谢谢@Extrakun,我无法测试您当前的代码,但错误消息是什么?在编译还是运行时?或者发生了什么?没有错误消息,只是忽略了where子句和orderby子句。@Extrakun,可能是您没有编译它,或者您没有将结果复制到输出文件夹中,这似乎是不可能的。
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()
var entries = GetPointTransaction(1); 
return entries.Where(x => x.When >= start && w.When <= end).OrderbyDescending(x => x.When);
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(.....);
}