查询了下自动生成的代码,看到如下TUser表的定义:
public System.Data.Linq.Table<TUser> TUser
{
get
{
return this.GetTable<TUser>();
}
}
是不是意味着,任何时候使用LinqToSQL时都会执行一次this.Get<TUser>(),获得所有表数据一次
不意味,这个位置没有做缓存,不代表他的上层,或者下层里面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语句的。。 |
Table<TUser>并没有获得所有数据,GetTable的时候啥数据都没得到,根据你后期在Table对象中的Where、Select等操作才会生成具体的SQL去获取数据