About BelongsTo Id And Cache.

Mar 22, 2009 at 11:39 AM

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

        ///<summary>子类</summary>
        [HasMany(OrderBy = "Id DESC")]
        public abstract IList<vd_ToolBar> Children { get; set; }

        [Length(255)]
        public abstract string title { get; set; }

        [Length(255)]
        [AllowNull]
        public abstract string url { get; set; }

        [Length(255)]
        [AllowNull]
        public abstract string param { get; set; }

        public abstract int orders { get; set; }

    }



----------------------
 var tbs=vd_ToolBar.FindAll();

//这里生成了一句SQL

var pns = tbs.Where(p => p.Parent == null);

//我想从.net的对象里面读,不想再生成SQL了,我该怎么做...

 foreach (var pn in pns)
{
//这里还会生成SQL

               var bns =  tbs.Where(p=> p.Parent!=null && p.Parent.Id == pn.Id);
                foreach (var bn in bns)
                {
                        ////这里还会生成SQL每一次foreach都会生成一次...

                }
}
Coordinator
Mar 22, 2009 at 1:10 PM
只有FindById才会使用缓存,其它方式的查询,很难实现从缓存读取,而且很难保证缓存和数据库的一致性,所以都会生成SQL。
Coordinator
Mar 22, 2009 at 3:25 PM
对于你的这个问题,其实可以使用CK.K的方式,因为CK.K不检测是否存在此Column,也不进行Field到Column的转换,而是直接转成SQL:
var tbs = vd_ToolBar.Find(CK.K["ParentId" == null]);
Mar 22, 2009 at 3:49 PM
非常感谢老大的回复。我其实是只想用FindAll生成1个SQL,然后把结果载入一个对象.
然后后面的什么ParenId==null 啊什么的全部从这个对象读。就不再生成别的SQL了。
现在 DBentry已经做到这一点了。就是如果 FindAll里面没有BelongsTo
直接linq查找FindAll的对象Select,Where什么的是不会生成SQL的~
只是linq到BelongsTo的时候才生成 SQL,就这一点有一点点遗憾哈~~
Coordinator
Mar 23, 2009 at 6:47 AM
你的这一段代码,tbs.Where调用的是Linq To Object的函数,DbEntry对它根本没有控制权,也就无从处理了。