MVC搞明白之后,我们就要用一下linq to Entity了。它的基本语法与linq to sql很相似,只是在有一些地方有些区别,个人感觉最大的区别就是linq to sql有的一些功能,它没有,哇哈哈。。。。。。。。。为什么这么说呢。在后面的操作中,遇到了,我会提一下。
对于用习惯了ado.net的朋友来说,一下写linq to Entity会感觉有点别扭,为什么呢。主要是因为它的SQL写法也正常的我们平时写的写法有一点不一样。这里呢,我建议大家有时间的话,支看一下,SQL-Server 2005技术内幕,这本书。在第一章里,它给出了sql语句的执行顺序。
如下:
1, From : 对From子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1.
2, ON : 对VT1应用On筛选器。只有那些使<join_condition>为真的行才被插入VT2.
3, Outer(Join) : 如果指定了outer join(相对于Cross join 或 inner join),保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3,如果From子句包含两个以的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
4, Where : 对VT3应用where筛选器。只有使用<where_condition>为TRUE的行才被插入VT4.
5, Group By : 按Group By子句中的列列表对VT4中的行分组,生成VT5.
6, Cube | Rollup : 把超组插入VT5,生成VT6.
7, Having : 对VT6应用Having筛选器。只有使用<having_condition>为TRUE的组才会被插入VT7.
8, Select : 处理select列表,产生VT8.
9, Distinct : 将重复的行从VT8中移除,产生VT9。
10, Order by : 将VT9中的行按order by 子句的列列表排序,生成一个游标(VC10).
11, Top : 从VC10的开始处选择指定的数量或比例的行,生成表VT11,并返回调用者
如果你对里面的解释不是很了解,也没有什么关系,你只要了解,sql语句的执行顺序就是从1--11这个顺序。这样来看linq to Entity的语法,你可能就会好多了。
var tab = from t from table
join b from stu on t.id equals b.id
where t.schoolcode==schoolcode && b.sortcode=sortcode
orderby s.id
select new newtable{
id = t.id,
name = b.name
}
我们来看这个linq的语句,处了order by语句被提前外,别的都和执行的顺序是一样的,这样我们就好理解多了。
好了,下面我就来看一下,linq to Entity中最简单的操作,添加,修改,删除,列表
在C层中写linq to Entity之前,我们必须实例化一下我们建立的数据模型,
- NewETrainEntities newEtrain = new NewETrainEntities();
添加操作
- /// <summary>
- /// 添加操作
- /// </summary>
- /// <returns></returns>
- public ActionResult CreateSave()
- {
- //成功失败的标记
- int flag = 1;
- try
- {
- //这是对一个表Etrain_Announcement 的model进行定义
- Etrain_Announcement e_ann = new Etrain_Announcement();
- e_ann.schoolcode = Request.Form["hidschoolcode"].ToString();
- e_ann.UserType = Request.Form["selIsapp"].ToString();
- e_ann.contents = Request.Form["txtContents"].ToString();
- e_ann.sendTime = DateTime.Now;
- e_ann.createdate = DateTime.Now;
- e_ann.modifydate = DateTime.Now;
- newEtrain.AddToEtrain_Announcement(e_ann);
- //这里要注意,必须要写这个,我一开始以为加上前面的方法add了就已经添加了,这样不会添加,要进行savachanges()才行
- newEtrain.SaveChanges();
- }
- catch (Exception ex)
- {
- flag = 0;
- }
- return Content(flag.ToString());
- }
修改操作
- /// <summary>
- /// 修改操作
- /// </summary>
- /// <returns></returns>
- public ActionResult UpdateSave()
- {
- //成功失败的标记
- int flag = 1;
- try
- {
- int annid = Convert.ToInt32(Request.Form["hidid"]);
- var info = from ann in newEtrain.Etrain_Announcement
- where ann.id == annid
- select ann;
- //关于这个我一直有一个不解,就是我的记录无论是一条还是多条,都必须用foreach来取。不知道有没有别的方法,可以直接取出一条记录
- foreach (var item in info)
- {
- item.contents = Request.Form["txtContents"];
- }
- newEtrain.SaveChanges();
- }
- catch (Exception ex)
- {
- flag = 0;
- }
- return Content(flag.ToString());
- }
删除操作
- /// <summary>
- /// 删除公告
- /// </summary>
- /// <param name="id">公告ID</param>
- /// <returns></returns>
- public ActionResult DeleteInfo(string id)
- {
- //标记位
- int flag = 1;
- try
- {
- int annid = Convert.ToInt32(id);
- //这里被注掉的部分的是错误的写法,这里说明一下,我在刚开始用的时候,网上很多教程都是下面这个方法,可是你运行的时候,就会报错。
- //var info = from ann in newEtrain.Etrain_Announcement
- //where ann.id == annid
- //select ann;
- Etrain_Announcement info = newEtrain.Etrain_Announcement.First(p=>p.id==annid);
- //DeleteObject(object Entity)这里的值是一个object类型,可是你删除的最好传一个model否则就会出错
- newEtrain.DeleteObject(info);
- newEtrain.SaveChanges();
- }
- catch(Exception ex)
- {
- flag = 0;
- }
- return Content(flag.ToString());
- }
列表显示操作
- /// <summary>
- /// 公告列表显示
- /// </summary>
- /// <param name="id">学校标识</param>
- /// <returns></returns>
- public ActionResult adminIndex(string id)
- {
- ViewData["schoolcode"] = id;
- var annInfo = from ann in newEtrain.Etrain_Announcement
- where ann.schoolcode == id
- orderby ann.id descending
- select ann;
- //这里我用了Take(20)这个操作,为得是显示最后20条信息,这里的Tak()就类似于top
- return View(annInfo.Take(20));
- }
前台显示页面
- <% foreach (var item in Model)
- { %>
- <tr>
- <td>
- <% if (Html.Encode(item.contents).Length > 10)
- { %>
- <a href="/Announcement/UserView/<%=Html.Encode(item.id) %>">
- <%= Html.Encode(item.contents).Substring(0, 8)%>...</a>
- <%}
- else
- { %>
- <a href="/Announcement/UserView/<%=Html.Encode(item.id) %>">
- <%= Html.Encode(item.contents)%></a>
- <%} %>
- </td>
- <td>
- <%= Convert.ToDateTime(Html.Encode(item.sendTime)).ToShortDateString() %>
- </div>
- </td>
- </tr>
- <% } %>
这些简单的操作会用之后,做一个简单的留言板就没有问题了。后面我们还会对一些实际应用和一些其它的方法,进行说明