[英]using PredicateBuilder inside a select
我正在为我的应用程序创建一个Ad-hoc报告功能。 我将PredicateBuilder用于“Where”部分,但现在当我试图在“选择”部分使用它时,我无法成功。
代码示例:
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但我不能使用它因为我在'select'中调用一些sql用户定义的函数而DynamicLinq不支持它。
我认为问题在于,Linq to SQL不支持子查询,这是查询所需要的。 这就是为什么在你的情况下导航属性UserOrders
没有实现IQueryable
和查询无法在其上运行。
我可能错了。 但这证明我是对的: http : //blog.robustsoftware.co.uk/2009/01/why-linq-to-sql-is-not-proper-orm.html
您应该使用更好的ORM,如Entity Framework。
这样的解决方法怎么样? 您已根据架构更改了连接条件
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()
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.