private UserContext db = new UserContext(); //定义一个上下文
//查询
[EnableQuery] //属性,使前台修改,查询,过滤,排序.....
public IQueryable<User> Get() //返回一个集合,不需要从前台带任何参数
{
return db.Users; //返回Users集合
}
//用Id查询
[EnableQuery] //属性,使前台修改,查询,过滤,排序.....
public SingleResult<User> Get([FromODataUri] int key) //返回一个集合,从前台带一个Id,SingleResult<>表示包含零个或一个实体的IQueryable<>集合
{
IQueryable<User> result = db.Users.Where(p => p.Id == key); //根据前台Id查询集合
return SingleResult.Create(result); //从IQueryable<T>创建SingleResult<T>,无需显示指定类型T即可实例化
}
//增
public async Task<IHttpActionResult> Post(User User) //定义一个异步的方法,从前台传过来一个对象,IHttpActionResult是定义一个用于异步方法创建的命令
{
if (!ModelState.IsValid) //判断,非模型状态,有效
{
return BadRequest(ModelState); //恶意请求,返回模型
}
db.Users.Add(User); //添加对象
await db.SaveChangesAsync(); //提交
return Created(User); //创建一个指示控件
}
//修改
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<User> product) //Delta<>() 初始化新实例
{
if (!ModelState.IsValid) //非有效模型
{
return BadRequest(ModelState); //恶意请求,返回模型
}
var entity = await db.Users.FindAsync(key); //发送请求,异步查询主键是否存在
if (entity == null) //如果不存在
{
return NotFound(); //返回未找到
}
product.Patch(entity); //修改实体
try
{
await db.SaveChangesAsync(); //提交
}
catch (DbUpdateConcurrencyException) //提交的数据与数据库里的数据不符
{
if (!ProductExists(key)) //再次判断数据库里是否存在id
{
return NotFound(); //返回未找到
}
else
{
throw; //抛出
}
}
return Updated(entity); //返回更新的实体类
}
//修改
public async Task<IHttpActionResult> Put([FromODataUri] int key, User update) //定义一个异步方法.这个方法从前台传过一个int类型的id.一个对象
{
if (!ModelState.IsValid) //如果非模型状态,有效
{
return BadRequest(ModelState); //恶意请求,返回模型状态
}
if (key != update.Id) //判断前台id非等于数据库里对象的id
{
return BadRequest(); //返回失败
}
db.Entry(update).State = EntityState.Modified; //修改实体模型
try
{
await db.SaveChangesAsync(); //提交
}
catch (DbUpdateConcurrencyException) //提交的数据与数据库的不符 ,DbUpdateConcurrencyException表示以上错误将被该异常捕获
{
if (!ProductExists(key)) //再次判断数据库里是否有id
{
return NotFound(); //返回未找到
}
else
{
throw; //抛出
}
}
return Updated(update); //更新实体
}
private bool ProductExists(int key) //定义一个方法,从修改方法里的key传到这个方法里
{
return db.Users.Any(r => r.Id == key); //是否包含key
}
//删除
public async Task<IHttpActionResult> Delete([FromODataUri] int key) //定义一个异步的方法,从前台传过来一个id
{
var product = await db.Users.FindAsync(key); //这句话的意思是查询Id异步的(key) ,await等待异步完成,Async异步,FindAsync异步查询
if (product == null) //判断是否为null,是
{
return NotFound(); //返回不存在
}
db.Users.Remove(product); //否则查询出来后删除这个实体.
await db.SaveChangesAsync(); //提交
return StatusCode(HttpStatusCode.NoContent); //返回一个Http成功请求
}
//连接到视图
[ODataRoute("User({id})")] //自定义路由,ODataRoute()里面写控制器名
[HttpGet]
public IHttpActionResult GetList([FromODataUri] int id) //定义一个方法,需要一个Id
{
var ue = db.Users.Where(r => r.Id == id).Select(x => new View_list //定义一个新的模型视图
{
Id = x.Id, //模型里的Id等于User的Id
Name = x.Name, //Name等于User的Name
Pwd = x.PassWord, //Pwd等于User的PassWord
Sex = x.Sex, //Sex等于User的Sex
Birthday = x.Birthday, //Birthday等于User的Birthday
Mz = x.Nation.NationName //Mz等于Naton表里的NationName
});
return Ok<IEnumerable<View_list>>(ue);//返回一个集合
}
View_list类
public int Id { get; set; }
public string Name { get; set; }
public string Pwd { get; set; }
public string Sex { get; set; }
public DateTime Birthday { get; set; }
public string Mz { get; set; }
WebApiConfig.cs路由配置
config.Count().Select().OrderBy().Filter().Expand().MaxTop(null);
ODataModelBuilder builder = new ODataConventionModelBuilder();
var UserIe = builder.EntitySet<User>("User");
UserIe.EntityType.Collection.Function("GetList").Returns<View_list>(); //一个方法,表明这个方法指向View_list;
builder.EntitySet<Nation>("Nation");
config.MapODataServiceRoute(
routeName: "odata",
routePrefix: "odata",
model: builder.GetEdmModel()
);