相关疑难解决方法(0)

如何在通用扩展方法中使用字符串列名在IQueryable上应用OrderBy?

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只能在运行时确定.

有没有解决的办法?

.net c# linq entity-framework expression-trees

83
推荐指数
5
解决办法
8万
查看次数

使用LINQ为对象分页

如何在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)

.net c# linq paging

82
推荐指数
6
解决办法
12万
查看次数

如何动态指定Linq OrderBy参数?

如何指定传递给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

82
推荐指数
6
解决办法
7万
查看次数

C# - 使用属性名称作为字符串由属性排序的代码

当我将属性名称作为字符串时,对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.

.net c# linq linq-to-entities

72
推荐指数
6
解决办法
4万
查看次数

如何使用动态字符串参数执行OrderBy?

我想做这个:

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 sql-order-by

53
推荐指数
8
解决办法
10万
查看次数

强类型动态Linq排序

我正在尝试构建一些代码来动态排序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)

.net c# linq

25
推荐指数
3
解决办法
1万
查看次数

Dapper.NET和IQueryable

是否有计划使Dapper.net与IQueryable接口兼容?如果没有,使用Dapper与"表达式树"过滤器的解决方法是什么?

c# lambda dapper

22
推荐指数
1
解决办法
1万
查看次数

如何在Entity Framework中动态构造Order By Expression?

我使用以下方法构造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)

c# entity-framework

18
推荐指数
2
解决办法
6840
查看次数

按字符串生成EF orderby Expression

我想通过字符串参数生成表达式,一些代码如:

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原语或枚举类型.

c# linq entity-framework expression-trees

15
推荐指数
3
解决办法
9864
查看次数

避免切换案例-linq

可能重复:
动态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)

.net c# linq

14
推荐指数
2
解决办法
2359
查看次数