日期:2014-05-20  浏览次数:20789 次

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