首页 新闻 会员 周边 捐助

EntityFramework 递归问题,如何通过街道ID一次性查询省市区信息?

0
悬赏园豆:30 [已关闭问题] 关闭于 2017-08-16 18:02
复制代码
 public class Area : EntityBase
    {
        public int AreaId { get; set; }
        public string AreaName { get; set; }
        public int? ParentAreaId { get; set; }
        public string ShortName { get; set; }
        public string Lng { get; set; }
        public string Lat { get; set; }
        public Int16 Level { get; set; }
        public Int16 Sort { get; set; }
        public virtual Area ParentArea { get; set; }
        public virtual ICollection<Area> SubtArea { get; set; }
        public Area()
        {
            SubtArea = new HashSet<Area>();
        }
    }
复制代码

 以上是实体,ParentAreaId是上级ID,ParentAreaId为 null的时候为省。

我这个省市区街道只是个案列,实际做的是微商分销系统,单表基本上20万+数据,百万级也有但是少。这种树形关系基本10层+,一个市级代理商团队都是一千多人,一个省代理团队可是近万。

如果只是省市区街道4万+数据 直接放Redis 即可。

人死一寸灰的主页 人死一寸灰 | 初学一级 | 园豆:174
提问于:2017-07-28 14:36
< >
分享
所有回答(2)
0

多级数据我在ef是是用了一个独立的上下级表来保存关系.

查询是直接查这个元素下的所有节点.再从Area表中in查询所有数据.使用area中pid设置树结构

吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-28 15:39

这是种思路,就是麻烦。

那还不如直接一条数据保存省市区街道名称,通过Level区分当前级别。

支持(0) 反对(0) 人死一寸灰 | 园豆:174 (初学一级) | 2017-07-31 09:34

@人死一寸灰: 看实际情况吧.
这个方法挺方便的.我是用来维护代理上下级管理.代理分成报表的.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-31 09:53

@吴瑞祥: 不知道EF是否能生成这种SQL,以前都是用的存储过程或者表值函数。

DECLARE @ParentAreaId INT = 440902;
WITH t0 AS (
SELECT AreaId, AreaName, ParentAreaId FROM dbo.Areas WHERE AreaId = @ParentAreaId
UNION ALL
SELECT Areas.AreaId, Areas.AreaName, Areas.ParentAreaId FROM dbo.Areas INNER JOIN t0 ON t0.ParentAreaId = Areas.AreaId
)
SELECT * FROM t0 ORDER BY t0.AreaId DESC;

 

支持(0) 反对(0) 人死一寸灰 | 园豆:174 (初学一级) | 2017-07-31 10:01
0

这么简单的问题,根本和EF没有多少关系,只是效率和算法的问题。

空明流光 | 园豆:111 (初学一级) | 2017-07-28 17:56
DECLARE @ParentAreaId INT = 440902;
WITH t0 AS (
SELECT AreaId, AreaName, ParentAreaId FROM dbo.Areas WHERE AreaId = @ParentAreaId
UNION ALL
SELECT Areas.AreaId, Areas.AreaName, Areas.ParentAreaId FROM dbo.Areas INNER JOIN t0 ON t0.ParentAreaId = Areas.AreaId
)
SELECT * FROM t0 ORDER BY t0.AreaId DESC;

我要的是这种,你要说生成多条SQL查询多次的。那还叫作递归??

不会就别装逼,是大神请上代码或提供思路。

支持(0) 反对(0) 人死一寸灰 | 园豆:174 (初学一级) | 2017-07-31 09:32

@人死一寸灰: 傻逼,把所有数据都查出来,再C#递归不就行了。

支持(0) 反对(1) 空明流光 | 园豆:111 (初学一级) | 2017-07-31 11:47

@沧海一杰: 呵呵,单表四万多数据你都拿出来?如果单表一百万、一千万数据呢?

证明你不是傻逼啊,只会在嘴皮上取胜的人。

我这个省市区街道只是个案列,实际做的是微商分销系统,单表基本上20万+数据,百万级也有但是少。

支持(0) 反对(0) 人死一寸灰 | 园豆:174 (初学一级) | 2017-07-31 14:44

@人死一寸灰: 单表20万+数据,你的SQL还写成那样,还递归,你说你是不是傻逼?

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2017-07-31 15:22

@沧海一杰: 那应该怎么样呢,求大神教育。你行就上代码,别一口一个傻逼,秀自己的智商与下限。

支持(0) 反对(0) 人死一寸灰 | 园豆:174 (初学一级) | 2017-08-01 11:03

是你先出言不逊的,也怪不得我要骂人,问个问题都问得这么嚣张。即便我现在真有代码,我也没心情告诉你,即便真解决了问题,你也未必会领情,我何必做费力不讨好的事情呢。

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2017-08-02 09:52

@沧海一杰: 是的,说你装逼是因为你说“这么简单的问题”,结果是你提供的内容有价值?

在工作中我也经常遇到光动嘴不动手的人。如果你解决了我的问题这30个园豆自然是你的。

装逼只是一个玩笑用词,我在日常生活中经常用到,见惯不怪。

支持(0) 反对(0) 人死一寸灰 | 园豆:174 (初学一级) | 2017-08-03 12:03

@人死一寸灰: 难道我第一句话说错了,我的那句话本身就是你的解决方案,你也不会有比那个更好的解决方案。

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2017-08-03 15:18

@沧海一杰: 

我是没看见你的效率与算法下面是我的解决方案,希望你能提供 高效的算法。

在数据库写了个表值函数,在表值函数中CTE递归。代码如下:

db.Database.SqlQuery<实体>("SELECT * From dbo.函数名(主键)");
支持(0) 反对(0) 人死一寸灰 | 园豆:174 (初学一级) | 2017-08-07 15:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册