Entity FrameWork 6帮助类
public class BaseDAL
{
string strConn = "";
public BaseDAL(string connString)
{
strConn = connString;
} #region 通用增删改查
#region 非原始sql语句方式
/// <summary>
/// 新增
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Add<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Entry<T>(entity).State = EntityState.Added;
return db.SaveChanges() > ;
}
} /// <summary>
/// 修改
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Update<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Modified;
return db.SaveChanges() > ;
}
} /// <summary>
/// 删除
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Delete<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
return db.SaveChanges() > ;
}
} /// <summary>
/// 根据条件删除
/// </summary>
/// <param name="deleWhere">删除条件</param>
/// <returns>返回受影响行数</returns>
public bool DeleteByConditon<T>(Expression<Func<T, bool>> deleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
List<T> entitys = db.Set<T>().Where(deleWhere).ToList();
entitys.ForEach(m => db.Entry<T>(m).State = EntityState.Deleted);
return db.SaveChanges() > ;
}
} /// <summary>
/// 查找单个
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
public T GetSingleById<T>(int id) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().Find(id);
}
} /// <summary>
/// 查找单个
/// </summary>
/// <param name="seleWhere">查询条件</param>
/// <returns></returns>
public T GetSingle<T>(Expression<Func<T, bool>> seleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().FirstOrDefault(seleWhere);
}
} /// <summary>
/// 获取所有实体集合
/// </summary>
/// <returns></returns>
public List<T> GetAll<T>() where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().ToList<T>();
}
} /// <summary>
/// 获取所有实体集合(单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetAll<T, Tkey>(Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable(), orderWhere, isDesc).ToList<T>();
}
} /// <summary>
/// 获取所有实体集合(多个排序)
/// </summary>
/// <returns></returns>
public List<T> GetAll<T>(params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable(), orderByExpression).ToList();
}
} /// <summary>
/// 单个排序通用方法
/// </summary>
/// <typeparam name="Tkey">排序字段</typeparam>
/// <param name="data">要排序的数据</param>
/// <param name="orderWhere">排序条件</param>
/// <param name="isDesc">是否倒序</param>
/// <returns>排序后的集合</returns>
public IQueryable<T> CommonSort<T, Tkey>(IQueryable<T> data, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
if (isDesc)
{
return data.OrderByDescending(orderWhere);
}
else
{
return data.OrderBy(orderWhere);
}
} /// <summary>
/// 多个排序通用方法
/// </summary>
/// <typeparam name="Tkey">排序字段</typeparam>
/// <param name="data">要排序的数据</param>
/// <param name="orderWhereAndIsDesc">字典集合(排序条件,是否倒序)</param>
/// <returns>排序后的集合</returns>
public IQueryable<T> CommonSort<T>(IQueryable<T> data, params OrderModelField[] orderByExpression) where T : class
{
//创建表达式变量参数
var parameter = Expression.Parameter(typeof(T), "o"); if (orderByExpression != null && orderByExpression.Length > )
{
for (int i = ; i < orderByExpression.Length; i++)
{
//根据属性名获取属性
var property = typeof(T).GetProperty(orderByExpression[i].PropertyName);
//创建一个访问属性的表达式
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter); string OrderName = "";
if (i > )
{
OrderName = orderByExpression[i].IsDESC ? "ThenByDescending" : "ThenBy";
}
else
OrderName = orderByExpression[i].IsDESC ? "OrderByDescending" : "OrderBy"; MethodCallExpression resultExp = Expression.Call(typeof(Queryable), OrderName, new Type[] { typeof(T), property.PropertyType },
data.Expression, Expression.Quote(orderByExp)); data = data.Provider.CreateQuery<T>(resultExp);
}
}
return data;
} /// <summary>
/// 根据条件查询实体集合
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T>(Expression<Func<T, bool>> seleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().Where(seleWhere).ToList();
}
} /// <summary>
/// 根据条件查询实体集合
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T, TValue>(Expression<Func<T, TValue>> seleWhere, IEnumerable<TValue> conditions) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{ return db.Set<T>().AsExpandable().WhereIn<T, TValue>(seleWhere, conditions).ToList();
}
} /// <summary>
/// 根据条件查询实体集合(单个字段排序)
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T, Tkey>(Expression<Func<T, bool>> seleWhere, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderWhere, isDesc).ToList();
}
} /// <summary>
/// 根据条件查询实体集合(多个字段排序)
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T>(Expression<Func<T, bool>> seleWhere, params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderByExpression).ToList();
}
} /// <summary>
/// 获取分页集合(无条件无排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return db.Set<T>().AsExpandable().Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(无条件单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable(), orderWhere, isDesc).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(无条件多字段排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T>(int pageIndex, int pageSize, out int totalcount, params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable(), orderByExpression).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件无排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return db.Set<T>().AsExpandable().Where(seleWhere).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere,
Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderWhere, isDesc).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件多字段排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere,
out int totalcount, params OrderModelField[] orderModelFiled) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderModelFiled).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
}
#endregion #region 原始sql操作
/// <summary>
/// 执行操作
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
public void ExecuteSql(string sql, params object[] paras)
{
using (SysDb db = new SysDb(strConn))
{
db.Database.ExecuteSqlCommand(sql, paras);
}
} /// <summary>
/// 查询列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public List<T> QueryList<T>(string sql, params object[] paras) where T : class
{
using (SysDb db = new SysDb(strConn))
{
return db.Database.SqlQuery<T>(sql, paras).ToList();
}
} /// <summary>
/// 查询单个
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public T QuerySingle<T>(string sql, params object[] paras) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Database.SqlQuery<T>(sql, paras).FirstOrDefault();
}
} /// <summary>
/// 执行事务
/// </summary>
/// <param name="lsSql"></param>
/// <param name="lsParas"></param>
public void ExecuteTransaction(List<String> lsSql, List<Object[]> lsParas)
{
using (SysDb db = new SysDb(strConn))
{
using (var tran = db.Database.BeginTransaction())
{
try
{
for (int i = ; i < lsSql.Count; i++)
{
if (lsParas != null && lsParas.Count > )
{
db.Database.ExecuteSqlCommand(lsSql[i], lsParas[i]);
}
}
foreach (String item in lsSql)
{
db.Database.ExecuteSqlCommand(item);
} tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
}
}
}
#endregion
#endregion #region 通用属性
/// <summary>
/// 获取数据库服务器当前时间。
/// </summary>
public DateTime ServerTime
{
get
{
using (SysDb db = new SysDb(strConn))
{
String sql = "SELECT GETDATE()";
Object objServerTime = db.Database.SqlQuery<Object>(sql);
return Convert.ToDateTime(objServerTime);
}
}
} /// <summary>
/// 获取数据库版本。
/// </summary>
public String DatabaseVersion
{
get
{
using (SysDb db = new SysDb(strConn))
{
try
{
String sql = "SELECT Version FROM Sys_Version";
Object objServerTime = db.Database.SqlQuery<Object>(sql);
return Convert.ToString(objServerTime);
}
catch
{
}
return String.Empty;
}
}
}
#endregion }
public static class QueryableExtension
{
/// <summary>
/// 扩展方法 支持 in 操作
/// </summary>
/// <typeparam name="TEntity">需要扩展的对象类型</typeparam>
/// <typeparam name="TValue">in 的值类型</typeparam>
/// <param name="source">需要扩展的对象</param>
/// <param name="valueSelector">值选择器 例如c=>c.UserId</param>
/// <param name="values">值集合</param>
/// <returns></returns>
public static IQueryable<TEntity> WhereIn<TEntity, TValue>(this IQueryable<TEntity> source, Expression<Func<TEntity, TValue>> valueSelector,
IEnumerable<TValue> values)
{
if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); }
if (null == values) { throw new ArgumentNullException("values"); }
ParameterExpression p = valueSelector.Parameters.Single(); if (!values.Any())
{
return source;
}
var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
return source.Where(Expression.Lambda<Func<TEntity, bool>>(body, p));
}
}
public struct OrderModelField
{ public bool IsDESC { get; set; }
public string PropertyName { get; set; }
}
dbcontext类: public class SysDb : DbContext
{
bool isNew = true;//是否是新的sql执行
string strMsg = "";//sql执行的相关信息
string strConn = "";//数据库连接字符串
string UserName = "";//日志用户名称
string AdditionalInfo = "";//日志额外信息
public SysDb(string connString) : // 数据库链接字符串
base(connString)
{
strConn = connString;
Database.SetInitializer<SysDb>(null);//设置为空,防止自动检查和生成
base.Database.Log = (info) => Debug.WriteLine(info);
} public SysDb(string connString, string logUserName, string logAdditionalInfo) : // 数据库链接字符串
base(connString)
{
strConn = connString;
Database.SetInitializer<SysDb>(null);//设置为空,防止自动检查和生成
UserName = logUserName;
AdditionalInfo = logAdditionalInfo;
base.Database.Log = AddLogger;
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//去掉复数映射
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
} /// <summary>
/// 添加日志
/// </summary>
/// <param name="info"></param>
public void AddLogger(string info)
{
if (info != "\r\n" && (!info.Contains("Sys_EventLog")))
{
string strTemp = info.ToUpper().Trim();
if (isNew)
{
//记录增删改
if (strTemp.StartsWith("INSERT") || strTemp.StartsWith("UPDATE") || strTemp.StartsWith("DELETE"))
{
strMsg = info;
isNew = false;
}
}
else
{
if (strTemp.StartsWith("CLOSED CONNECTION"))
{
//增加新日志
using (SysDb db = new SysDb(strConn))
{
try
{
//保存日志到数据库或其他地方 }
catch (Exception ex)
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "//logError.txt"))
{
sw.Write(ex.Message);
sw.Flush();
}
}
}
//清空
strMsg = "";
isNew = true;
}
else
{
strMsg += info;
}
} }
} }
public class SysDb<T> : SysDb where T : class
{
public SysDb(string connString) : // 数据库链接字符串
base(connString)
{
Database.SetInitializer<SysDb<T>>(null);//设置为空,防止自动检查和生成
} public SysDb(string connString, string logUserName, string logAdditionalInfo) : // 数据库链接字符串
base(connString,logUserName,logAdditionalInfo)
{
Database.SetInitializer<SysDb<T>>(null);//设置为空,防止自动检查和生成
} public DbSet<T> Entities { get; set; }
}
界面使用:(bll层忽略) public class BusinessController : Controller
{
//
// GET: /Jygl/Business/
BaseBLL basebll = new BaseBLL(WebHelper.Conn); public ActionResult GetXMList(int page,int rows)
{
int count = ;
//查询条件
//Expression<Func<JY_XM, bool>> searchPredicate = PredicateBuilder.True<JY_XM>();
//searchPredicate = searchPredicate.And(c => c.UserName.Contains(""));
Expression<Func<JY_XM, int>> keySelector = u => u.UID;
string str = ExceptionHelper<JY_XM>.TryCatchPageQueryJson<int>(basebll.GetListPaged, page, rows, keySelector, false, out count);
return Content(str);
} [HttpPost]
public ActionResult XMEdit(JY_XM jyxm)
{
basebll.Add(jyxm);
return View();
} public ActionResult GetAllGCLB()
{ List<DICT_GCLB> lsGCLB = basebll.GetAll<DICT_GCLB>();
DICT_GCLB dicNew=new DICT_GCLB();
dicNew.GCLBText="-请选择-";
dicNew.GCLBId=;
lsGCLB.Add(dicNew); return Content(WebHelper.Json(lsGCLB));
} public ActionResult GetAllArea()
{
List<DICT_Area> lsArea = basebll.GetAll<DICT_Area>();
DICT_Area dicNew=new DICT_Area();
dicNew.AreaText="-请选择-";
dicNew.AreaId=;
lsArea.Add(dicNew);
return Content(WebHelper.Json(lsArea));
}
}
Entity FrameWork 6帮助类的更多相关文章
- Asp.Net MVC 使用Entity Framework创建模型类
先来说说LINQ to SQL和Entity Framework的区别: LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术.他们之间的本质区别在于EF ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类)
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- entity framework 封装基类
/// <summary> /// 查询业务基实现 /// </summary> /// <typeparam name="T"></ty ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 如何处理Entity Framework / Entity Framework Core中的DbUpdateConcurrencyException异常(转载)
1. Concurrency的作用 场景有个修改用户的页面功能,我们有一条数据User, ID是1的这个User的年龄是20, 性别是female(数据库中的原始数据)正确的该User的年龄是25, ...
- 《Entity Framework 6 Recipes》中文翻译系列 (16) -----第三章 查询之左连接和在TPH中通过派生类排序
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-10应用左连接 问题 你想使用左外连接来合并两个实体的属性. 解决方案 假设你有 ...
- Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)
本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试 ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
随机推荐
- SQLite vs MySQL vs PostgreSQL:关系型数据库比较
自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛.面对如此之多的关系型数据库,我们应该如何权衡找出适合自己应用场景 ...
- 如何让你的JavaScript代码更加语义化
语义化这个词在 HTML 中用的比较多,即根据内容的结构化选择合适的标签.其作用不容小觑: 赋予标签含义,让代码结构更加清晰,虽然我们可以在标签上添加 class 来标识,但这种通过属性来表示本体的形 ...
- 实现 Math.Asin 迈克劳林(泰勒)展开式,结果比Math.Asin 慢一倍
项目中需要快速求解Asin(x) 的近似值,原以为用泰勒展开式会快一些,结果比原生的慢一倍. Math.ASin Time Elapsed: 9ms Gen 0: ...
- hibernate注解方法使用总结(转)
原博文地址:http://blog.sina.com.cn/s/blog_935ebb670101dnre.html 1.类级别注解 @Entity 映射实体类 @Table 映射数据库 ...
- fir.im Weekly - 暖心的 iOS 持续集成,你值得拥有
一则利好消息,flow.ci 支持 iOS 项目持续集成,想试试的伙伴去 Gitter群 问问.首批尝鲜用户@阿米amoy 已经用 flow.ci 实现了基本的 iOS 持续集成,并详细记录整个 Bu ...
- 使用paramiko如何连接服务器?
本文和大家分享的是python开发中使用paramiko连接服务器的方法和步骤,希望通过本文的,对大家学习和使用paramiko有所帮助. ssh连接步骤 1.ssh server建立server p ...
- 让hammer完美支持Pixi.js - 2D webG库
由于项目改造,采用2D webG的pixi库,那么基于canvas的结构上,事件就是最大的一个问题了 改造的原理很简单,把hammer里面的addEventListeners事件绑定给第三方库代替,事 ...
- ASP.NET MVC之表单集合数据自动绑定到对象属性(集合)中
前言 之前没遇到过这个问题,在项目中遇到这个问题时想法挺好,按照流程走下去,结果事与愿违,于是开始探索着解决方案,接下来我们来看看这个问题,早已经明了的童鞋请绕道,此文仅供未遇到的童鞋提供一种解决方案 ...
- Web APi之HttpClient注意事项以及建议(四)
前言 之前对于用SelfHost来手动实现Web API的宿主模式,似乎不是太深入,所以本篇文章我们一起来讨论关于利用HttpClient来访问Web API上的资源来进行探讨以及注意相关事项,希望此 ...
- 引用类型-Function类型
Function类型 定义函数的三种方式: 1.函数声明 function sum(num1,num2){ return num1 +num2; } 2.函数表达式 var sum = functio ...