我扩展了一个SELECT函数,以便从字符串列表中选择SELECT的自定义字段。
您将在下面的图像中看到的功能是:第201行的SelectExtend()。
当我在调试模式下运行时。当我在第201行上运行时,Watch窗口中的查询值是不同的。
我在调用SelectExtend()函数之前和之后捕获了图像。
任何人都可以向我解释为什么查询返回" System.Data.Entity.Infrastructure.DbQuery",而不是"选择[Project1]。[ID],....&#34 ;
我希望查询返回为"选择[Project1]。[ID],...."
感谢阅读。
这是函数的源代码" SelectExtend()"
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);
}
答案 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);
}
的结果。