我在动态LINQ 的VS2008示例中找到了一个示例,它允许您使用类似sql的字符串(例如,OrderBy("Name, Age DESC"))用于排序.不幸的是,包含的方法仅适用于IQueryable<T>;.有没有办法获得此功能IEnumerable<T>?
我正在尝试动态添加orderby表达式.但是当执行下面的查询时,我得到以下异常:
System.NotSupportedException:无法创建类型为"Closure type"的常量值.在此上下文中仅支持原始类型(例如Int32,String和Guid').
奇怪的是,我只查询那些原始类型.
string sortBy = HttpContext.Current.Request.QueryString["sidx"];
ParameterExpression prm = Expression.Parameter(typeof(buskerPosting), "posting");
Expression orderByProperty = Expression.Property(prm, sortBy);
// get the paged records
IQueryable<PostingListItemDto> query =
(from posting in be.buskerPosting
where posting.buskerAccount.cmsMember.nodeId == m.Id
orderby orderByProperty
//orderby posting.Created
select new PostingListItemDto { Set = posting }).Skip<PostingListItemDto>((page - 1) * pageSize).Take<PostingListItemDto>(pageSize);
Run Code Online (Sandbox Code Playgroud)
希望有人能对此有所了解!
我已经看过这个关于如何在Entity Framework中动态创建OrderBy表达式的答案.但我还想构建一个动态Where表达式.有点像这样:
public IEnumerable<InventoryItem> GetAll(string filterBy, object value)
{
var results = new List<InventoryItem>();
using (var db = new InventoryDb())
{
if (QueryHelper.PropertyExists<InventoryItem>(filterBy))
{
var query = db.rri_InventoryItems.WhereByProperty(filterBy, value);
foreach(var item in query.Where(expr))
{
results.Add(ConvertItem(item));
}
}
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
传入属性以过滤by和值作为ab对象.Queryable有两种方法,哪里都有两个参数,所以我甚至不确定哪一个是正确的.
而且在这一点上我失去了一点点.我不确定如何重构原始的OrderByProerty方法来提供WhereByProperty.我知道我在这里完全错了.我不知道该怎么做.
理想情况下,我想通过提供可用于使用ands和or运算符构建查询的对象集合来进一步扩展它.
我在尝试对 Order 表中没有的任何列进行排序时遇到此错误,如果我使用OrderBy("Customer.CompanyName" + " " + sortDir)该错误将消失但所有列都将无法排序。下面OrderBy使用的方法来自这里。
问题的原因是什么?
public ActionResult WebGrid(int page = 1, int rowsPerPage = 10, string sortCol = "OrderID", string sortDir = "ASC")
{
List<Order> res;
using (var nwd = new NorthwindEntities())
{
var _res = nwd.Orders
.OrderBy(sortCol + " " + sortDir)
.Select(o => new Order
{
OrderID = o.OrderID,
OrderDate = o.OrderDate,
CompanyName = o.Customer.CompanyName,
FirstName = o.Employee.FirstName,
//......
//......
//......
});
Run Code Online (Sandbox Code Playgroud)