代码改变世界

随笔档案-2011年07月

ADO.NET Entity Framework 批量更新/批量删除扩展

2011-07-30 11:57 by ※森林小居※, 6879 阅读, 收藏, 编辑

        一直都在想着用ADO.NET Entity Framework开发项目,只是Entity Framework 中不能同时更新多条记录。所以一直没有使作其开发。最近在看到了一些LINQ TO SQL的一些扩展方法,本人就LINQ TO SQL的扩展也实行了对Entity Framework扩展。主要代码如下:

       以下是更新的扩展代码:

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/// <summary>
/// 更新满足条件的实体,返回更新实体的条数
 /// </summary>
/// <typeparam name="T">更新的类型</typeparam>
/// <param name="Entity">实体类</param>
/// <param name="Predicate">更新的条件</param>
/// <param name="Updater">更新的值</param>
/// <returns>int</returns>
public static int UpdateEntity<T>(this ObjectSet<T> Entity, Expression<Func<T, bool>> Predicate, Expression<Func<T, T>> Updater) where T : class
{
    ConditionBuilder Builder = new ConditionBuilder();
    Builder.Build(Predicate.Body);
    string sqlCondition = Builder.Condition;
    //获取Update的赋值语句
    var updateMemberExpr = (MemberInitExpression)Updater.Body;
    var updateMemberCollection = updateMemberExpr.Bindings.Cast<MemberAssignment>().Select(c => new
    {
        Name = c.Member.Name,
        Value = ((ConstantExpression)c.Expression).Value
    });
    int i = Builder.Arguments.Length;
    string sqlUpdateBlock = string.Join(", ", updateMemberCollection.Select(c => string.Format("[{0}]={1}", c.Name, "{" + (i++) + "}")).ToArray());
    string commandText = string.Format("Update {0} Set {1} Where {2}", Entity.EntitySet.Name, sqlUpdateBlock, sqlCondition);
    //获取SQL参数数组 (包括查询参数和赋值参数)
    var args = Builder.Arguments.Union(updateMemberCollection.Select(c => c.Value)).ToArray();
    var Result = Entity.Context.ExecuteStoreCommand(commandText, args);
    return Result;
}

 

    以下是删除方法的扩展:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
 /// 删除满足条件的实体,返回删除实体的条数
  /// </summary>
/// <typeparam name="T">删除的类型</typeparam>
/// <param name="Entity">实体类</param>
/// <param name="Predicate">删除的条件</param>
/// <returns>int</returns>
public static int DeleteEntity<T>(this ObjectSet<T> Entity, Expression<Func<T, bool>> Predicate) where T : class
{
    //查询条件表达式转换成SQL的条件语句
    ConditionBuilder Builder = new ConditionBuilder();
    Builder.Build(Predicate.Body);
    string sqlCondition = Builder.Condition;
    //获取SQL参数数组
    var args = Builder.Arguments;
    var Result = Entity.Context.ExecuteStoreCommand("Delete  From  " + Entity.EntitySet.Name + " Where " + sqlCondition, args);
    return Result;
}

 

        批量更新/批量删除主要是通过拼接SQL语句执行。还需高手多多指点。点击此处下载源码

C#动态调用Web服务的3种方法

2011-07-29 09:59 by ※森林小居※, 1205 阅读, 收藏, 编辑
摘要: 我们在开发C# WinForm时,有时会调用Web服务,服务是本地的当前好办,只要在Project中的Web References中引入就可以在代码中直接创建一个Web服务对象来引用,其实其原理是C#帮你自动创建客户端代理类的方式调用WebService,但如果调用的服务是动态的,比如说在几个IIS中都有相同的一个服务,在运行时输入具体的IP才确定调用哪个服务,那要怎么样实现呢。C#动态调用Web服务方法一: 手动的添加一个Web引用,然后修改下本地的代理类。最后实现Web Service的URI部署到配置文件里。 具体做法如下:以下代码是显示如何配置动态的Web Service,以服务单元C 阅读全文
点击右上角即可分享
微信分享提示