首页 新闻 会员 周边

entity framework中 dbset 和 IQueryable类型的问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-12-18 14:55

为什么可以写context.persons.query();其中context.persons是dbset,而不能如下图所示

 
 
下图中query方法改为了扩展方法,dbset可以当iqueryable使用
 
 
 
 
Hello Zepp!的主页 Hello Zepp! | 初学一级 | 园豆:3
提问于:2012-12-17 16:20
< >
分享
最佳答案
0

dbset 是实际数据了,要用实参。

query<person>(dbset, .....); 或者 query(dbset, .....);

收获园豆:20
Qlin | 老鸟四级 |园豆:2403 | 2012-12-17 17:21

没有明白您说的意思

Hello Zepp! | 园豆:3 (初学一级) | 2012-12-17 19:21

@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 是对应的,当然没错。

Qlin | 园豆:2403 (老鸟四级) | 2012-12-17 20:10
View Code
 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! | 园豆:3 (初学一级) | 2012-12-17 22:34

@Hello Zepp!: 

还是没明白,连变量申明 都 弄错了 ??
IQueryable<TEntity> query = dbSet;  // 是TEntity?

dbSet又是怎么声明的?

Qlin | 园豆:2403 (老鸟四级) | 2012-12-18 08:37

@Qlin: 能给俺您的QQ吗,咱Q上聊吧

Hello Zepp! | 园豆:3 (初学一级) | 2012-12-18 10:27
其他回答(2)
0

裂图啊,亲

Rich.T | 园豆:3440 (老鸟四级) | 2012-12-17 16:30

现在能看了吗

支持(0) 反对(0) Hello Zepp! | 园豆:3 (初学一级) | 2012-12-17 16:39

@Hello Zepp!: 

可以啊,为什么不可以

支持(0) 反对(0) Rich.T | 园豆:3440 (老鸟四级) | 2012-12-17 16:42

@Rich.T: 给看看问题哈!!!

支持(0) 反对(0) Hello Zepp! | 园豆:3 (初学一级) | 2012-12-17 16:48

@Hello Zepp!: 

你现在是出了啥情况,是编译不通过呢,还是什么情况

支持(0) 反对(0) Rich.T | 园豆:3440 (老鸟四级) | 2012-12-17 16:50

@Rich.T: 我现在的问题是:为什么可以context.persons.query(),注意这里的query是原图中的扩展方法。这里的context.persons是iqueryable。但我把这个扩展方法改成第一张图,,传入dbset(不就是context.persons吗)就不行啊

支持(0) 反对(0) Hello Zepp! | 园豆:3 (初学一级) | 2012-12-17 17:06
0

图一个都没有显示出来

chenping2008 | 园豆:9836 (大侠五级) | 2012-12-17 16:34

现在能看了吗

支持(0) 反对(0) Hello Zepp! | 园豆:3 (初学一级) | 2012-12-17 16:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册