Linq的一些记录
1.
IQueryable接口与IEnumberable接口的区别: IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
2.
Linq使用Func<T, bool>时候会产生全表查询,使用Expression<Func<T, bool>>这个来避免,参考:http://www.cnblogs.com/dudu/archive/2012/04/01/enitity_framework_func.html
3.
EF的find方法是先从内存中查询,内存中没有才查询数据库。
4.
调用Load方法就会加载数据到内存中
5.
this.actionServer.Delete(t => list.Contains(t.Id)),使用这样的方法删除,会生成一天select语句,然后根据查询到的数据逐个删除,根据查到的数据生成多个删除语句
6.
仅对 LINQ to Entities 中已排序的输入支持方法“Skip”。必须在调用“Skip”方法之前调用方法“OrderBy”。(排序时用skip需要注意)
7.
在使用Json序列化EF的Model时,Model有导航属性,可以使用Select以避免导航属性在序列化时产生循环引用,例如:
linq 的like
obj.Name.Contains("名字")//%名字%
obj.Name.EndsWith("名字")//名字%
obj.Name.StartsWith("名字")//%名字
System.Data.Linq.SqlClient.SqlMethods.Like(t.Name, "客服%(这里可以写通配符表达式)")
9.
in 与 not in
//in 操作
int[] i={1,2};
var s=db.Categories.Where(t=>i.Contains(t.CategoryID));
//not in 操作
int[] i={1,2};
var s=db.Categories.Where(t=>!i.Contains(t.CategoryID));