public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
where T : EntityObject
{
var param = Expression.Parameter(typeof(T), "o");
var body = Expression.PropertyOrField(param,columnName);
var sortExpression = Expression.Lambda(body, param);
return query.OrderBy(sortExpression);
}
Run Code Online (Sandbox Code Playgroud)
因为OrderBy的类型不是从sortExpression中推断出来的,所以我需要在运行时指定类似的东西:
var sortExpression = Expression.Lambda<T, TSortColumn>(body, param);
Run Code Online (Sandbox Code Playgroud)
要么
return query.OrderBy<T, TSortColumn>(sortExpression);
Run Code Online (Sandbox Code Playgroud)
我不认为这是可能的,因为TSortColumn只能在运行时确定.
有没有解决的办法?
如何在LINQ查询中实现分页?实际上,如果可以模仿sql TOP函数,我会感到满意.但是,我确信无论如何都需要尽快提供完整的分页支持.
var queryResult = from o in objects
where ...
select new
{
A = o.a,
B = o.b
}
????????? TOP 10????????
Run Code Online (Sandbox Code Playgroud) 如何指定传递给orderby使用我作为参数的值的参数?
例如:
List<Student> existingStudends = new List<Student>{ new Student {...}, new Student {...}}
Run Code Online (Sandbox Code Playgroud)
目前实施:
List<Student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();
Run Code Online (Sandbox Code Playgroud)
而不是c.Address,我如何将其作为参数?
例
string param = "City";
List<Student> orderbyAddress = existingStudends.OrderByDescending(c => param).ToList();
Run Code Online (Sandbox Code Playgroud) 当我将属性名称作为字符串时,对C#中的属性进行编码的最简单方法是什么?例如,我想允许用户通过他们选择的属性(使用LINQ)来订购一些搜索结果.他们将在UI中选择"order by"属性 - 当然是字符串值.有没有办法直接使用该字符串作为linq查询的属性,而不必使用条件逻辑(if/else,switch)将字符串映射到属性.反射?
从逻辑上讲,这就是我想做的事情:
query = query.OrderBy(x => x."ProductId");
Run Code Online (Sandbox Code Playgroud)
更新:我最初没有指定我正在使用Linq to Entities - 看起来反射(至少GetProperty,GetValue方法)不会转换为L2E.
我想做这个:
var orderBy = "Nome, Cognome desc";
var timb = time.Timbratures.Include("Anagrafica_Dipendente")
.Where(p => p.CodDipendente == 1);
if(orderBy != "")
timb = timb.OrderBy(orderBy);
Run Code Online (Sandbox Code Playgroud)
是否有OrderBy可用的超载接受字符串参数?
我正在尝试构建一些代码来动态排序Linq IQueryable <>.
显而易见的方法是在这里,使用字符串字符串对列表进行排序
http://dvanderboom.wordpress.com/2008/12/19/dynamically-composing-linq-orderby-clauses/
但是,我想要一个更改 - 编译字段名称的时间检查,以及使用重构/查找所有引用来支持以后的维护的能力.这意味着我想将字段定义为f => f.Name,而不是字符串.
对于我的具体用途,我想封装一些代码,这些代码将决定应该根据用户输入使用命名的"OrderBy"表达式列表中的哪一个,而不必每次都编写不同的代码.
这是我写的内容的要点:
var list = from m Movies select m; // Get our list
var sorter = list.GetSorter(...); // Pass in some global user settings object
sorter.AddSort("NAME", m=>m.Name);
sorter.AddSort("YEAR", m=>m.Year).ThenBy(m=>m.Year);
list = sorter.GetSortedList();
...
public class Sorter<TSource>
...
public static Sorter<TSource> GetSorter(this IQueryable<TSource> source, ...)
Run Code Online (Sandbox Code Playgroud)
GetSortedList函数确定要使用哪个命名排序,这会产生List对象,其中每个FieldData包含在AddSort中传递的字段的MethodInfo和Type值:
public SorterItem<TSource> AddSort(Func<T, TKey> field)
{
MethodInfo ... = field.Method;
Type ... = TypeOf(TKey);
// Create item, add item to diction, add fields to …Run Code Online (Sandbox Code Playgroud) 是否有计划使Dapper.net与IQueryable接口兼容?如果没有,使用Dapper与"表达式树"过滤器的解决方法是什么?
我使用以下方法构造Order By Expression.原始来源
它真的很光滑.缺点是它只适用于Property是字符串类型.
如何在不为不同数据类型创建一堆方法的情况下使其接受不同的Property 类型?
public static bool PropertyExists<T>(string propertyName)
{
return typeof (T).GetProperty(propertyName, BindingFlags.IgnoreCase |
BindingFlags.Public | BindingFlags.Instance) != null;
}
public static Expression<Func<T, string>> GetPropertyExpression<T>(string propertyName)
{
if (typeof(T).GetProperty(propertyName, BindingFlags.IgnoreCase |
BindingFlags.Public | BindingFlags.Instance) == null)
{
return null;
}
var paramterExpression = Expression.Parameter(typeof(T));
return (Expression<Func<T, string>>)Expression.Lambda(
Expression.PropertyOrField(paramterExpression, propertyName), paramterExpression);
}
Run Code Online (Sandbox Code Playgroud)
// orderBy can be either Name or City.
if (QueryHelper.PropertyExists<Club>(orderBy))
{
var orderByExpression = QueryHelper.GetPropertyExpression<Club>(orderBy);
clubQuery = …Run Code Online (Sandbox Code Playgroud) 我想通过字符串参数生成表达式,一些代码如:
private Expression<Func<Task, T>> Generate(string orderby)
{
switch (orderby)
{
case "Time":
return t => t.Time;
case "Money":
return t => t.RewardMoney;
default:
return t => t.Id;
}
}
Run Code Online (Sandbox Code Playgroud)
然后叫它:
_context.Items.OrderBy(Generate("Money"));
Run Code Online (Sandbox Code Playgroud)
但它无法编译!我将T改为对象.
private Expression<Func<Task, object>> Generate(string orderby)
Run Code Online (Sandbox Code Playgroud)
然后它可以编译,但它不起作用.
System.NotSupportedException:无法将类型"System.Int32"强制转换为"System.Object"类型.LINQ to Entities仅支持转换EDM原语或枚举类型.
可能重复:
动态LINQ OrderBy
switch (sort) {
case "Title":
queryResults = queryResults.OrderBy(r => r.Title);
break;
default:
queryResults = queryResults.OrderBy(r => r.LastName);
break;
Run Code Online (Sandbox Code Playgroud)
有什么办法可以摆脱上面的开关块吗?
我可以做一些事情:
queryResults = queryResults.OrderBy(r => r."sort");
or
queryResults = queryResults.OrderBy(r => r.sort);
Run Code Online (Sandbox Code Playgroud)