怎么把这简单linq代码封装成一个通用方法?

时间:2022-06-04 20:51:02
Student 表
代码意思:如果存在则更新,不存在则添加.根据它的id来判断是否存在.
 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来判断存在就更新.不存在就添加.
请帮忙封装下.

15 个解决方案

#1


看看你的Dc 里面有没有类似 Student r2= dc.get(typeof(Student))的方法.
如果有就换过来,之后把所有的Student换成T所有代码复制到一个方法,基本就完工了.

dc.Student.InsertOnSubmit(r2); 方法看名称似乎不妥,应该是dc.Student.Insert (r2); 吧.

#2


右键选中的代码
选择菜单,重构,提取方法

#3


引用 1 楼 kkbac 的回复:
看看你的Dc 里面有没有类似 Student r2= dc.get(typeof(Student))的方法.
如果有就换过来,之后把所有的Student换成T所有代码复制到一个方法,基本就完工了.

dc.Student.InsertOnSubmit(r2); 方法看名称似乎不妥,应该是dc.Student.Insert (r2); 吧.

这是系统自带的linq to sql 生成的.
只有InsertOnSubmit没有Insert 
dc(DataContext)也是自动生成的.没有get方法.你看看有没有其他办法.

#4


引用 2 楼 jiuhexuan 的回复:
右键选中的代码
选择菜单,重构,提取方法

你好,这个操作出来的方法只能是这个Student表才能用.怎么变成通用的?

#5




我只能说以这个过程比较多余,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,所以你可以自己去查询资料看这个方法怎么写

#6


引用 5 楼 wanghui0380 的回复:


我只能说以这个过程比较多余,why?实际上ORM本身就自带状态控制,所以你不需要自己计算,你只需要查询一下ORM自己的状态就ok了

基于这样的特性,你就可以重构他


int r3加入量 = 0, r4更新量 = 0;
            foreach (var item in Students)
            {
                St……

你好,你这样先赋值再判断是否为空.这样不行的吧.
  r2 = item;  
  if(r2==null) dc.Student.InsertOnSubmit(r2);

#7


行状态这个东西我还不知道有没有.搜了下没搜到.只能先这样自己加.

#8


话说sqlhelper都有人做.
linqhelper怎么就那么难呢..高手请现身..

#9


linq to sql不熟悉,只能帮你友情顶一下了.

#10


高手们出来.

#11


求真相

#12


我问的问题都没能解决.伤心中....

#13


自定义泛型泛型方法应该可以

#14


添加计数、更新计数也可以通过向StateEntry传递Option查询,但可能受你Context其他地方的修改影响。

以下代码未经测试,仅供参考:

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++;
}
}
}

#15


无满意结贴.

#1


看看你的Dc 里面有没有类似 Student r2= dc.get(typeof(Student))的方法.
如果有就换过来,之后把所有的Student换成T所有代码复制到一个方法,基本就完工了.

dc.Student.InsertOnSubmit(r2); 方法看名称似乎不妥,应该是dc.Student.Insert (r2); 吧.

#2


右键选中的代码
选择菜单,重构,提取方法

#3


引用 1 楼 kkbac 的回复:
看看你的Dc 里面有没有类似 Student r2= dc.get(typeof(Student))的方法.
如果有就换过来,之后把所有的Student换成T所有代码复制到一个方法,基本就完工了.

dc.Student.InsertOnSubmit(r2); 方法看名称似乎不妥,应该是dc.Student.Insert (r2); 吧.

这是系统自带的linq to sql 生成的.
只有InsertOnSubmit没有Insert 
dc(DataContext)也是自动生成的.没有get方法.你看看有没有其他办法.

#4


引用 2 楼 jiuhexuan 的回复:
右键选中的代码
选择菜单,重构,提取方法

你好,这个操作出来的方法只能是这个Student表才能用.怎么变成通用的?

#5




我只能说以这个过程比较多余,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,所以你可以自己去查询资料看这个方法怎么写

#6


引用 5 楼 wanghui0380 的回复:


我只能说以这个过程比较多余,why?实际上ORM本身就自带状态控制,所以你不需要自己计算,你只需要查询一下ORM自己的状态就ok了

基于这样的特性,你就可以重构他


int r3加入量 = 0, r4更新量 = 0;
            foreach (var item in Students)
            {
                St……

你好,你这样先赋值再判断是否为空.这样不行的吧.
  r2 = item;  
  if(r2==null) dc.Student.InsertOnSubmit(r2);

#7


行状态这个东西我还不知道有没有.搜了下没搜到.只能先这样自己加.

#8


话说sqlhelper都有人做.
linqhelper怎么就那么难呢..高手请现身..

#9


linq to sql不熟悉,只能帮你友情顶一下了.

#10


高手们出来.

#11


求真相

#12


我问的问题都没能解决.伤心中....

#13


自定义泛型泛型方法应该可以

#14


添加计数、更新计数也可以通过向StateEntry传递Option查询,但可能受你Context其他地方的修改影响。

以下代码未经测试,仅供参考:

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++;
}
}
}

#15


无满意结贴.