Tree , ParentId

Apr 12, 2009 at 3:25 PM
很多场合都需要在FindAll之后直接读取BelongsTo类型的Id,
比如快速处理树的时候。
但是DbEntry暂不支持直接读取,每次读取都要生成SQL。
于是现在我用如下这种方法绕过这个问题。

------------------------------------------------------------

    public abstract class vd_ToolBar : LinqObjectModel<vd_ToolBar>
    {
        ///<summary>父类</summary>
        [BelongsTo, DbColumn("ParentId"), Index]
        public abstract vd_ToolBar Parent { get; set; }

        [Exclude]
        public abstract long ParentId { get; set; }
        
//1)首先定义一个Exclude类型的变量

------------------------------------------------------

public class Tree
    {
        private DbObjectList<vd_ToolBar> tbs { get; set; }

        public Tree()
        {
            tbs = vd_ToolBar.FindAll();
//2)然后在FindAll之后手动把这个ParentId映射到那个Exclude类型的变量上。
            foreach (var tb in tbs)
            {
                ObjectInfo oi = ObjectInfo.GetInstance(tb.GetType());
                foreach (var m in oi.RelationFields)
                {
                    if (m.IsBelongsTo && m.Name=="ParentId")
                    {
                        var o = (IBelongsTo)m.GetValue(tb);
                        tb.ParentId=(long)o.ForeignKey;
                    }
                }                
            }
            
        }

        private void AddNode(TreeNode N, long ParentId)
        {
//3)这样做的好处就是在每一次读取这个值的时候不会生成新的SQL~速度很快。
           var ts=from p in tbs where p.ParentId == ParentId select p;
           foreach (var t in ts)
           {
               var N1= new TreeNode(t.mc);
               N.Nodes.Add(N1);
               AddNode(N1, t.Id);
           }
        }


        public TreeNode GenerateTree()
        {
            var Root = new TreeNode("Root");
            AddNode(Root, 0);
            return Root;
        }
    }
----------------------------------------------------------------------------------
开始我想定义一个BelongsToMapAttribute(Name=Parent)加在Exclude旁边,
然后用HasAttribute和GetValue和SetValue搞定他,
做成一个通用的方法,但是我发现加了Exclude的变量在oi.Fields里面遍历不出来。
而且,BelongsTo类型MemberHanlder获得的Name值是DbColumn里面定义的String.
很困惑,就没有做成通用方法。
于是就直接给值了。
------------------
如果老大觉得有必要的话能否在DBentry里面添加个Attribute,
然后在LoadRelationValues的时候自动把ForeignKey映射到相应的定义了的ParentId上
不知您是否会考虑把这样的Feature加入~~
Coordinator
Apr 13, 2009 at 4:08 AM
我曾经考虑过,对于BelongsTo,如果只读取Id,则不引发Load,不过也比较麻烦。
我个人比较建议对于需要快速处理的表,另写一个Model类进行处理。
当然,不使用abstract的property,而是自己写那个belongsTo,应该可以直接读取FK,可以参见unit test中的例子,不过,不是很建议就是了。