怎么把这简单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++;
}
}
}