首页 新闻 会员 周边

LinqToSQL查询问题

0
悬赏园豆:10 [已关闭问题]

查询了下自动生成的代码,看到如下TUser表的定义:
public System.Data.Linq.Table<TUser> TUser
{
 get
 {
 return this.GetTable<TUser>();
 }
}
是不是意味着,任何时候使用LinqToSQL时都会执行一次this.Get<TUser>(),获得所有表数据一次

问题补充: 通过设置断点测试,例如db.TUser.Where(u=>u.id==id); db.TUser的结果集的确已经有TUser表的内容!? 如果如下面所说什么也没获取,那为什么能看到TUser表的内容?
清風揚諰的主页 清風揚諰 | 初学一级 | 园豆:197
提问于:2010-05-27 20:21
< >
分享
其他回答(1)
0

不意味,这个位置没有做缓存,不代表他的上层,或者下层里面return this.GetTable<TUser>();里没有做缓存的。。。。。

5。28加上去:我用Reflectior得到相关方法的实现,你看看。

public Table<TEntity> GetTable<TEntity>() where TEntity: class
{
    this.CheckDispose();
    MetaTable metaTable = this.services.Model.GetTable(typeof(TEntity));
    if (metaTable == null)
    {
        throw Error.TypeIsNotMarkedAsTable(typeof(TEntity));
    }
    ITable table = this.GetTable(metaTable);
    if (table.ElementType != typeof(TEntity))
    {
        throw Error.CouldNotGetTableForSubtype(typeof(TEntity), metaTable.RowType.Type);
    }
    return (Table<TEntity>) table;
}
private ITable GetTable(MetaTable metaTable)
{
    ITable table;
    if (!this.tables.TryGetValue(metaTable, out table))
    {
        ValidateTable(metaTable);
        table = (ITable) Activator.CreateInstance(typeof(Table<>).MakeGenericType(new Type[] { metaTable.RowType.Type }), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new object[] { this, metaTable }, null);
        this.tables.Add(metaTable, table);
    }
    return table;
}
private Dictionary<MetaTable, ITable> tables;
从这段代码可以看到是有缓存配置的,但是从代码来看只会得到表的元数据(是否得到数据表数据我不清楚),
就我所知,是不会得到数据表数据的,那太傻了。你所说能得到数据最可能是原因是因为你得到的是
一个Table<>,而你在调试点击结果视图时,他会自动从数据库来加载信息(你可以选表数据多的,如果
这时有延迟就表明我这猜想结果应是对的)。
而相关查询IQueryable<T>用Where和Select就如下面所说是会转换成SQL语句的。。
天天不在 | 园豆:926 (小虾三级) | 2010-05-27 20:48
0

Table<TUser>并没有获得所有数据,GetTable的时候啥数据都没得到,根据你后期在Table对象中的Where、Select等操作才会生成具体的SQL去获取数据

Gray Zhang | 园豆:17610 (专家六级) | 2010-05-27 21:49
通过测试的确如此
支持(0) 反对(0) 清風揚諰 | 园豆:197 (初学一级) | 2010-05-28 09:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册