为什么可以写context.persons.query();其中context.persons是dbset,而不能如下图所示
dbset 是实际数据了,要用实参。
query<person>(dbset, .....); 或者 query(dbset, .....);
没有明白您说的意思
@Hello Zepp!:
调用一个泛型方法时类型要对应。
如 Query<TEntity>(dbSet,decriptor,out totalPage)
//你的dbSet 是TEntity的集合?显然TEntity只是一个形参而已,实际类型是你的dbSet类型
应该是这样调用的 Query<Person>(dbSet,decriptor,out totalPage),
或者是 Query(dbSet,decriptor,out totalPage),由于你的是 扩展方法 也可以是这样
dbSet.Query(decriptor,out totalPage).
下面那幅图 Data 和T 是对应的,当然没错。
1 #region 4、DynamicQuery 2 public IQueryable<TEntity> Query(this IQueryable<TEntity> data, QueryDescriptor descriptor) 3 { 4 int totalPages = 0; 5 IQueryable<TEntity> query = dbSet; 6 return query.Query(descriptor, out totalPages); 7 } 8 9 public static IQueryable<TEntity> Query(this IQueryable<TEntity> data, QueryDescriptor descriptor, out int totalPages) 10 { 11 totalPages = 0; 12 var parser = new QueryExpressionParser<TEntity>(); 13 14 //filter 15 var filter = parser.Parse(descriptor); 16 var result = data.Where(filter); 17 18 //order 19 if (descriptor.OrderBy != null) 20 { 21 Type type = typeof(TEntity); 22 var parameter = Expression.Parameter(type); 23 24 var propertyInfo = type.GetProperty(descriptor.OrderBy.Key); 25 Expression propertySelector = Expression.Property(parameter, propertyInfo); 26 27 //To deal with different type of the property selector, very hacky 28 //looking for a better solution 29 if (propertyInfo.PropertyType == typeof(string)) 30 { 31 var orderby = Expression.Lambda<Func<TEntity, string>>(propertySelector, parameter); 32 if (descriptor.OrderBy.Order == OrderSequence.DESC) 33 result = result.OrderByDescending(orderby); 34 else 35 result = result.OrderBy(orderby); 36 } 37 else if (propertyInfo.PropertyType == typeof(decimal)) 38 { 39 var orderby = Expression.Lambda<Func<TEntity, decimal>>(propertySelector, parameter); 40 if (descriptor.OrderBy.Order == OrderSequence.DESC) 41 result = result.OrderByDescending(orderby); 42 else 43 result = result.OrderBy(orderby); 44 } 45 else if (propertyInfo.PropertyType == typeof(int)) 46 { 47 var orderby = Expression.Lambda<Func<TEntity, int>>(propertySelector, parameter); 48 if (descriptor.OrderBy.Order == OrderSequence.DESC) 49 result = result.OrderByDescending(orderby); 50 else 51 result = result.OrderBy(orderby); 52 } 53 else if (propertyInfo.PropertyType == typeof(double)) 54 { 55 var orderby = Expression.Lambda<Func<TEntity, double>>(propertySelector, parameter); 56 if (descriptor.OrderBy.Order == OrderSequence.DESC) 57 result = result.OrderByDescending(orderby); 58 else 59 result = result.OrderBy(orderby); 60 } 61 else if (propertyInfo.PropertyType == typeof(float)) 62 { 63 var orderby = Expression.Lambda<Func<TEntity, float>>(propertySelector, parameter); 64 if (descriptor.OrderBy.Order == OrderSequence.DESC) 65 result = result.OrderByDescending(orderby); 66 else 67 result = result.OrderBy(orderby); 68 } 69 } 70 71 //paging 72 if (descriptor.PageSize > 0) 73 { 74 int totalCount = result.Count(); 75 totalPages = totalCount % descriptor.PageSize == 0 ? totalCount / descriptor.PageSize : totalCount / descriptor.PageSize + 1; 76 return result.Skip((descriptor.PageIndex - 1) * descriptor.PageSize).Take(descriptor.PageSize); 77 } 78 return result; 79 } 80 #endregion
@Qlin: 您好,我暂时改成这样,但是
还是不行,,您看看代码吧,,应该怎么改。。本段代码是在GenericRepository.cs里的。
@Hello Zepp!:
还是没明白,连变量申明 都 弄错了 ??
IQueryable<TEntity> query = dbSet; // 是TEntity?
dbSet又是怎么声明的?
@Qlin: 能给俺您的QQ吗,咱Q上聊吧
裂图啊,亲
现在能看了吗
@Hello Zepp!:
可以啊,为什么不可以
@Rich.T: 给看看问题哈!!!
@Hello Zepp!:
你现在是出了啥情况,是编译不通过呢,还是什么情况
@Rich.T: 我现在的问题是:为什么可以context.persons.query(),注意这里的query是原图中的扩展方法。这里的context.persons是iqueryable。但我把这个扩展方法改成第一张图,,传入dbset(不就是context.persons吗)就不行啊
图一个都没有显示出来
现在能看了吗