【问题标题】:Dictionary of Linq Expression [duplicate]Linq 表达式字典 [重复]
【发布时间】:2010-09-29 07:39:04
【问题描述】:

可能重复:
Declaring func<in T,Out Result> dynamically

我正在尝试使用 linq-to-sql 构建查询,为了提供排序功能,我编写了如下内容:

private Dictionary<string, Expression<Func<DataAccess.Auditing, object>>> OrderDict { get; set; }


OrderDict = new Dictionary<string,Expression<Func<Augeos.GereonWeb.DataAccess.Auditing, object>>>();
OrderDict.Add("Date", p => (DateTime)p.RequestDateTime);
OrderDict.Add("Username", p => (string)p.CdUsername);
OrderDict.Add("Portfolio", p => (string)p.CdPortfolio);
OrderDict.Add("Url", p => (string)p.RequestedUrl);
OrderDict.Add("Result", p => (bool)p.RequestResult);
OrderDict.Add("Duration", p => (float)p.RequestDuration);


private IQueryable<DataAccess.Auditing> SetOrder(string orderBy, bool orderDirection, IQueryable<DataAccess.Auditing> query)
{
    if (orderDirection)
    return query.OrderByDescending(OrderDict[orderBy]);
    else
    return query.OrderBy(OrderDict[orderBy]);
}

我的目标是使用 SortOrder 函数对查询进行排序。主要问题是 Func 返回一个对象,而 linq 无法对这种类型的元素进行排序。我确实需要使用 object 作为返回类型,因为我必须按多种类型进行排序。实际上是否可以稍微修改此代码并使其工作?

谢谢,

吉奥

【问题讨论】:

    标签: c# linq-to-sql dictionary


    【解决方案1】:

    嗯,您必须在查询的表达式树中进入非常低的级别才能执行此操作。更简单的方法是使用 DynamicLinq 库,您可以在其中使用列作为字符串值执行 .OrderBy()。可以在here on Scott Guthrie's blog 找到文档。

    【讨论】:

      【解决方案2】:

      如果您想像这样对查询进行排序:

      query = orderDict["Date"](query, true);
      

      那么你的字典必须这样定义:

      var orderDict = new Dictionary<string, Func<IQueryable<Auditing>, bool, IQueryable<Auditing>>>();
      

      你可以像这样向它添加项目:

      orderDict.Add("Date", MakeOrderedQueryDelegate(a => a.RequestDateTime));
      orderDict.Add("UserName", MakeOrderedQueryDelegate(a => a.CdUsername));
      

      这需要 MakeOrderedQueryDelegate 是这样的:

      private Func<IQueryable<Auditing>, bool, IQueryable<Auditing>> MakeOrderedQueryDelegate<T>(Expression<Func<Auditing, T>> keyselector)
      {
          return (q, descending) => { return MakeOrderedQuery(q, descending, keyselector); };
      }
      

      ..你可以像这样实现 MakeOrderedQuery:

      private IQueryable<Auditing> MakeOrderedQuery<T>(IQueryable<Auditing> query, bool descending, 
          Expression<Func<Auditing, T>> keyselector)
      {
          if (descending)
          {
              return query.OrderByDescending(keyselector);
          }
          else
          {
              return query.OrderBy(keyselector);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-08
        • 2018-08-10
        • 1970-01-01
        • 2021-07-01
        相关资源
        最近更新 更多