【问题标题】:Query String from IQueryable built using PredicateBuilder使用 PredicateBuilder 构建的 IQueryable 中的查询字符串
【发布时间】:2020-01-14 10:35:30
【问题描述】:

我有一个扩展方法,它从未使用 PredicateBuilder 构建的 IQueryable 返回查询字符串 - 这在 WITH PredicateBuilder 构建时不起作用。

我已经尝试了在网上找到的标准 IQueryable 代码,该代码有效。

var predicate = PredicateBuilder.False<Vehicle>();
predicate = predicate.Or(p => p.RegNo == criteria);
IQueryable<VehicleSearch> vehicles = (from sv in context.Vehicles select sv
                       ).AsExpandable().Where(predicate).Select(v => new VehicleSearch … etc etc
string s = vehicles.ToTraceString(); // invoke extension method

我使用了 Steve Fenton 的示例,但还有其他相同的示例,问题是 IQueryable 中没有“_internalQuery”字段,也许我需要查看其他地方。

【问题讨论】:

  • “查询字符串”是什么意思?

标签: c# linq extension-methods iqueryable predicatebuilder


【解决方案1】:

这是一个改进版本的尝试:

public static class IQueryableExt {
    static IQueryable<T> _inner<T>(this ExpandableQuery<T> eq) {
        var ExpandableQuery__inner_FieldInfo = typeof(ExpandableQuery<T>).GetField("_inner", BindingFlags.NonPublic | BindingFlags.Instance);
        return (IQueryable<T>)ExpandableQuery__inner_FieldInfo.GetValue(eq);
    }

    public static string ToTraceString<T>(this IQueryable<T> q) {
        switch (q) {
            case ObjectQuery<T> oq: return oq.ToTraceString();
            case ExpandableQuery<T> eq: return eq._inner().ToTraceString();
            default:
                return q.ToString();
        }
    }
}

【讨论】:

  • 感谢您的帮助。我将“q.ToString()”设置为一个变量,然后从“q”获取 ObjectQuery,这样我就可以将参数列表添加到结果中或用参数值替换占位符。
猜你喜欢
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 2010-09-23
  • 2013-06-10
  • 2012-01-17
  • 1970-01-01
相关资源
最近更新 更多