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 即可。
多级数据我在ef是是用了一个独立的上下级表来保存关系.
查询是直接查这个元素下的所有节点.再从Area表中in查询所有数据.使用area中pid设置树结构
这是种思路,就是麻烦。
那还不如直接一条数据保存省市区街道名称,通过Level区分当前级别。
@人死一寸灰: 看实际情况吧.
这个方法挺方便的.我是用来维护代理上下级管理.代理分成报表的.
@吴瑞祥: 不知道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;
这么简单的问题,根本和EF没有多少关系,只是效率和算法的问题。
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查询多次的。那还叫作递归??
不会就别装逼,是大神请上代码或提供思路。
@人死一寸灰: 傻逼,把所有数据都查出来,再C#递归不就行了。
@沧海一杰: 呵呵,单表四万多数据你都拿出来?如果单表一百万、一千万数据呢?
证明你不是傻逼啊,只会在嘴皮上取胜的人。
我这个省市区街道只是个案列,实际做的是微商分销系统,单表基本上20万+数据,百万级也有但是少。
@人死一寸灰: 单表20万+数据,你的SQL还写成那样,还递归,你说你是不是傻逼?
@沧海一杰: 那应该怎么样呢,求大神教育。你行就上代码,别一口一个傻逼,秀自己的智商与下限。
是你先出言不逊的,也怪不得我要骂人,问个问题都问得这么嚣张。即便我现在真有代码,我也没心情告诉你,即便真解决了问题,你也未必会领情,我何必做费力不讨好的事情呢。
@沧海一杰: 是的,说你装逼是因为你说“这么简单的问题”,结果是你提供的内容有价值?
在工作中我也经常遇到光动嘴不动手的人。如果你解决了我的问题这30个园豆自然是你的。
装逼只是一个玩笑用词,我在日常生活中经常用到,见惯不怪。
@人死一寸灰: 难道我第一句话说错了,我的那句话本身就是你的解决方案,你也不会有比那个更好的解决方案。
@沧海一杰:
我是没看见你的效率与算法下面是我的解决方案,希望你能提供 高效的算法。
在数据库写了个表值函数,在表值函数中CTE递归。代码如下:
db.Database.SqlQuery<实体>("SELECT * From dbo.函数名(主键)");