为什么查询返回System.Data.Entity.Infrastructure.DbQuery <t>而不是T-SQL查询字符串

时间:2017-08-03 02:10:03

标签: c# entity-framework linq linq-to-sql

我扩展了一个SELECT函数,以便从字符串列表中选择SELECT的自定义字段。

您将在下面的图像中看到的功能是:第201行的SelectExtend()。

当我在调试模式下运行时。当我在第201行上运行时,Watch窗口中的查询值是不同的。

我在调用SelectExtend()函数之前和之后捕获了图像。

任何人都可以向我解释为什么查询返回&#34; System.Data.Entity.Infrastructure.DbQuery&#34;,而不是&#34;选择[Project1]。[ID],....&#34 ;

我希望查询返回为&#34;选择[Project1]。[ID],....&#34;

感谢阅读。

Before run over line 201

After run over line 201

这是函数的源代码&#34; SelectExtend()&#34;

public static IQueryable<T> SelectExtend<T>(this IQueryable<T> source, List<string> fields)
    {
        if (fields == null || fields.Count <= 0)
            throw new ArgumentException("'fields' can not be null or empty.");

        var parameter = Expression.Parameter(source.ElementType, "x");
        var body = Expression.MemberInit(
            Expression.New(typeof(T)),
            fields.Select(field => Expression.Bind(
                typeof(T).GetProperty(field),
                Expression.PropertyOrField(parameter, field))
            )
        );

        var selector = Expression.Lambda(body, parameter);
        var expression = Expression.Call(
            typeof(Queryable)
            , "Select"
            , new[] { source.ElementType, selector.Body.Type }
            , source.Expression
            , Expression.Quote(selector)
        );

        return source.Provider.CreateQuery<T>(expression);
    }

1 个答案:

答案 0 :(得分:0)

不完全确定发生了什么。通常它是调用提供者的if (filterableData.name.equals("b") && filterableData.value != null && filterableData.value.toString().contains("org.jacorb.orb.CDROutputStream")) { long occuranceTime = TimeTHelper.read(filterableData.value.create_input_stream()); System.out.println("data.value: " + occuranceTime); } 方法,向它传递一个调用表达式给自己。他们可能会以不同的方式做到这一点。

如果您修改方法以便调用Queryable.XXX并返回它返回的内容(清洁代码作为奖励),该怎么办?

请注意,在您的情况.Select中,typeof(T)source.ElementType都是相同的。

selector.Body.Type

(还删除了对零字段的检查,因为您的代码仍然可以执行它应该执行的操作。)

如果你仍然得到相同的结果,那么一切都可以。毕竟,您在调试器中看到的只是类决定显示的内容,默认情况下是public static IQueryable<T> SelectExtend<T>(this IQueryable<T> source, IList<string> fields) { if (source == null) throw new ArgumentNullException(nameof(source)); if (fields == null) throw new ArgumentNullException(nameof(fields)); var parameter = Expression.Parameter(typeof(T), "x"); var body = Expression.MemberInit( Expression.New(typeof(T)), fields.Select(field => Expression.Bind( typeof(T).GetProperty(field), Expression.PropertyOrField(parameter, field)) ) ); var selector = Expression.Lambda<Func<T, T>>(body, parameter); return source.Select(selector); } 的结果。