怎么把这简单linq代码封装成一个通用方法?
Student 表
代码意思:如果存在则更新,不存在则添加.根据它的id来判断是否存在.
- C# code
int r3加入量 = 0, r4更新量 = 0; foreach (var item in Students) { Student r2= dc.Student.SingleOrDefault(o => o.bbid == item.bbid); if (r2!=null) { r2 = item; r4更新量++; } else { r2 = item; dc.Student.InsertOnSubmit(r2); r3加入量++; } } dc.SubmitChanges(); p1加入量 = r3加入量; p2更新量 = r4更新量;输入:
dc(DataContext) Students(学生集) bbid(依据是学生的id)
输出:
out 加入量 out更新量
怎么让它变成通用的.以后不管什么表都可以根据ID来判断存在就更新.不存在就添加.
请帮忙封装下.
[解决办法]
看看你的Dc 里面有没有类似 Student r2= dc.get(typeof(Student))的方法.
如果有就换过来,之后把所有的Student换成T所有代码复制到一个方法,基本就完工了.
dc.Student.InsertOnSubmit(r2); 方法看名称似乎不妥,应该是dc.Student.Insert (r2); 吧.
[解决办法]
右键选中的代码
选择菜单,重构,提取方法
[解决办法]
额
我只能说以这个过程比较多余,why?实际上ORM本身就自带状态控制,所以你不需要自己计算,你只需要查询一下ORM自己的状态就ok了
基于这样的特性,你就可以重构他
int r3加入量 = 0, r4更新量 = 0;
foreach (var item in Students)
{
Student r2= dc.Student.SingleOrDefault(o => o.bbid == item.bbid);
r2 = item;
if(r2==null) dc.Student.InsertOnSubmit(r2);
}
r3=//统计查询dc中的行状态为add的数据
r4=//统计dc中行状态为modify的数据
dc.SubmitChanges();
}
ps:ORM中理所应该具有状态查询功能,因为他自己也需要根据行状态去构建sql语句,自己我不玩linq2sql,所以你可以自己去查询资料看这个方法怎么写
[解决办法]
linq to sql不熟悉,只能帮你友情顶一下了.
[解决办法]
自定义泛型泛型方法应该可以
[解决办法]
添加计数、更新计数也可以通过向StateEntry传递Option查询,但可能受你Context其他地方的修改影响。
以下代码未经测试,仅供参考:
- C# code
private static void AddRange<TEntity>(ObjectContext context, IEnumerable<TEntity> entities, out int adding, out int updating) where TEntity : class{ var table = context.CreateObjectSet<TEntity>(); adding = 0; updating = 0; foreach (var entity in entities) { var key = context.CreateEntityKey(table.Name, entity); var original = context.GetObjectByKey(key) as TEntity; if (original == null) { table.AddObject(entity); adding++; } else { context.ObjectStateManager.GetObjectStateEntry(key).CurrentValues.SetValues(entity); updating++; } }}