帮我解释一下ASP.NET MVC5中的选择语句

red-fly 2019-08-05 05:23:09
刚开始自觉ASP.NET MVC5,看了些PDF文档,但似乎讲有关数据库的部分很少,所以去网上找相关的SQL语句,实在找不到门。
会了的不要笑我,我还在门外,很早之前是直接写sql语句(比如 select * from mytable,类似这样的),现在改了方式,实在找不着北。
以下内容全部在Controller中。

现在只会用如下这样的简单语法:
1. 选择整个表中的内容,并放入List
List<TbUser> userList = db.TbUsers.ToList();
这个用法似乎是最简单的,所以比较容易,也可以理解

2. 复杂一点的,要按照条件选
List<TbUser> userList = db.TbUsers.Where(m => m.UserName = "Admin").ToList();
这个里面的语句就弄不懂了,"m =>" 这算什么语法?

另外我不想转换成List,只想拿到选取的结果,除了
var userQuery = db.TbUsers.Where(m => m.UserName = "Admin");
这样写之外,我想 userQuery 为一个明确的类型,那开头的 var 应该换成什么呢?

3. 由于TbUsers表中有多个字段,我想只把UserName拿出来形成一个List,分两种情况,一种是整个表中的UserName,一种是符合某一条件的用户名列表。首先是符合条件的,在网上找了好久,也没有找到,后来从msdn帮助中有个示例,模仿写,可仍然不正确:
var query = db.TbUsers.Where(tb => tb.UserName == loginUser || tb.UserLevel < userLevel).Include(i => i.UserName);
List<string> userList = query.ToList(); // 这行不正确,提示大概为:无法将 List<TbUser>转换为List<string>

这究竟应该怎么写才能达到我的目的?

4. 接上面的3,我的目的是要把另外一个表 TbFiles 中内容是上面选出来的用户所输入的内容全部选出来,这个表中有个字段为 fwUserName,我这样写不知道是否正确(其中的userList为步骤3中的选取结果):
List<TbFiles> fileList = db.TbFiles.Where(tb => tb.fwUserName in userList).OrderByDescending(s => s.FileId).ToList();
由于上面的那些问题,所以这个步骤没法测试,也不知道是否正确。


5. 网上找了一个例子,也解释一下:
(来自 https://www.bbsmax.com/A/QV5Z1peZJy/)
public ActionResult Index()
{
  var userRoleList = from uu in db.SysUsers
   join ud in db.SysRoles on uu.RoleNum equals ud.RoleNum
  where uu.ID == 1
   select new UserRole {userName = uu.Name,userRole = ud.RoleName}
  return View(userRoleList);
}

这里的from又是什么语法?uu是字段还是表?



综上所述,太难了,估计主要是三个原因导致我无法入门:
A. 习惯了之前纯 SQL 的语法
B. 没有接触过其它新的概念(包含LinQ)
C. 对ASP.NET MVC的应用还没弄清楚是咋回事儿

除了上面的解释,我想了解的是,以上的那些语法,就是所谓的 LinQ?或者只是第5个才是LinQ语法?如果其它的不是LinQ语法,那又叫什么?这些东西,有哪些比较好的入门或者学习站点,或者书本?
(我现在除了搜索数据库相关的关键字之外,都不知道该搜索哪些东西来了解 ~汗~)
...全文
367 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
SinGooCMS 2019-08-14
  • 打赏
  • 举报
回复
LINQ是.net3.5加入的特性,如果你这都不了解,那之后的.net 4,4.5,4.6就更吃力了,建议先按着.net版本顺序都新加的功能都学习一遍!
iAm_Ike 2019-08-12
  • 打赏
  • 举报
回复
还有楼主所说的希望var是一个指定的类型不知道是不是对var理解有问题, var user=db.User.Where(m=>m.Id==1).FirstOrDefault(); User user=db.User.Where(m=>m.Id==1).FirstOrDefault(); 这两句其实是一样的,你把鼠标放在var上面,就会看到提示这个user是一个User类, var只是一个语法糖,它会自动帮你推断你所写的语句会返回什么类型,var比较方面你书写。
iAm_Ike 2019-08-12
  • 打赏
  • 举报
回复
我也是初学者,我说一下我对LINQ的看法,以下只代表个人意见,仅供参考。 从功能性上来说,写Sql语句和写LinQ都是为了查询到最后的结果,而LinQ通过EntityFramework 最后也是编译成Sql语句执行的。那么为什么还要写LinQ? 第一,我认为LinQ写起来很爽,带上语法智能提示之后可以迅速的写出相对应的SQL功能,并且在程序中写SQL是无法检测到SQL的语法错误的,而LinQ在IDE中是可以实时检测到你的语法有没有问题,不会写出无法正确执行的SQL语句。 第二,各个数据库的SQL语法虽然大同小异,但是某些功能还是不一样的。比如查询分页,SQL SERVER和MYSQL的语法就不一样,但是LinQ就可以无区别对待,如果你的数据库查询全部是通过LinQ,你可以直接把数据库换成另外一个,而不用担心你之前写的SQL语句不兼容。(当然很少情况下需要这么做。) 下面是我在学习LinQ和Lambda时的理解,先不说什么匿名函数和委托这些东西,单纯从语句意思上面来解释他是怎么用的。 这是一个查询User表中姓名是张三,年龄是18岁的lambda表达式。

var user=db.User      //我需要从User表里查询数据
.Where(m=>m.Name=="张三" && m.Age==18)  //我需要从User表查询一个对象,这个对象我给他起一个临时的名字,暂且叫他m吧,我希望m的名字叫张三,并且年龄是18
.FirstOrDefault();//,但我不知道他是一个单体还是列表,因为我无法确认是不是只有一个符合条件的记录。这一句代表我需要查询结果的第一条记录,如果查不到就返回默认的null,
这是一个查询Student表中班级是乙班的lambda表达式。

var classYiStudents = db.Student.Where(m=>m.Class=="乙班").ToList();//我明确知道这个查询结果肯定是一个列表,于是使用ToList()。
然后LinQ写起来就更类似Sql语句一些,比如还是查询User表中姓名是张三,年龄是18岁的记录。

var user=from u in db.User
               where u.Name=="张三" && u.Age ==18  //从User表中查询数据,并且给User表取一个别名叫u,后面就用u来替代db.User,然后就是一个where语句了,和Sql语句中的where语句是一样的。
               select new
               {
                    NewName = u.Name,
                    u.Age
               }
               //User表中可能还有其他的字段比如Id,Class等等,在本次查询中我们不需要用到,所以select语句和sql语句中的select的功能是一样的,都是选取中你需要的字段,在select new中你可以把原字段在重新命名,比如将u的Name字段重命名成NewName
秋的红果实 2019-08-10
  • 打赏
  • 举报
回复
2、where和sql中的差不多,后面跟选择条件,返回满足条件的记录 (m => m.UserName == "Admin") 等效于

foreach(var m in db.TbUsers)
{
     if(m.UserName == "Admin") 
    {
        找到了我要的记录;
    }
}

够明白了吧 3、List<string> userList = query.ToList(); ==> List<string> userList = query.Select(r=>r.UserName).ToList(); 4、和sql类似,用join,自己搜索linq join 5、linq写法,uu是字段 对了,我4、里提到的join,人家这个例子就是join 另外,我3、里写的也是linq,5、这种也是,两种格式
LvBao_117 2019-08-10
  • 打赏
  • 举报
回复
从头全面学习linq,一切问题都ok
k4android 2019-08-10
  • 打赏
  • 举报
回复
看一下linq和Sql语法楼主疑惑会解开
XBodhi. 2019-08-06
  • 打赏
  • 举报
回复
这个里面的语句就弄不懂了,"m =>" 这算什么语法?

=> 是lamuda 表达式。其实内部是一个 action 或是 fuction 的匿名函数。也就是委托,一个语法糖而以。
red-fly 2019-08-06
  • 打赏
  • 举报
回复
@Html.DropDownListFor(m => m.serverId, Model.serverList)
@Html.DropDownListFor(m => m.projectId, Model.projectList)

我有两个dropdown,在初始化的时候直接这样写,它应该就可以显示出来,但是我想在server这个选项改变时,对project的内容进行变更,如何添加事件?还有如果事件中用到了project在不同serverId情况下的数据缓存,又该如何缓存这些数据?
red-fly 2019-08-06
  • 打赏
  • 举报
回复
引用 11 楼 正怒月神 的回复:
楼主说的这个是lambda表达式,
其实我看你的问题,你更应该了解 entity framework。

夸奖了
弄了快一个月了,一个小项目还没有弄完。细节太多,没有人沟通,一个小问题很容易困住很长时间,看书本,只能慢慢看,这个项目上马,就没办法静下来仔细研究它了。
现在总体上大致弄清楚了Controller、Model、View三者的关系,具体到哪个东西的用法,还是需要弄会才行,现在使用的比较多的就是错误显示,labelfor、textfor这几个,还有controler和view之间的简单数值传递。还有数据库的最简单使用,现在还没法谈啥技巧呢
正怒月神 版主 2019-08-06
  • 打赏
  • 举报
回复
楼主说的这个是lambda表达式, 其实我看你的问题,你更应该了解 entity framework。
吾友客 2019-08-06
  • 打赏
  • 举报
回复
1、首先建议先去学习一些linq和lamda表达式的涵义,这样方便与自己理解; 2、他们的写法就是相当于把 select * from mytable 语句进行封装成接口和方法,便于使用; 看看书籍对自己很有帮助
hk8846 2019-08-05
  • 打赏
  • 举报
回复
要看关联关系
Eason0807 2019-08-05
  • 打赏
  • 举报
回复
你花几个小时去看一遍EF的官方文档,基础查询方面就不会有问题了
冰川711 2019-08-05
  • 打赏
  • 举报
回复
var query = (from t in db.TbUsers select t.UserName).ToList(); 这个就是 单独查询 UserName的列 当然你也可以 List<string> userList = (from t in db.TbUsers select t.UserName).ToList();
red-fly 2019-08-05
  • 打赏
  • 举报
回复
引用 2 楼 冰川711 的回复:
4. where里改成
tb =>query.Contains(tb.fwUserName)


我是在另外一个表中,如果第3步我得到的结果为 List<string> userList,那第4步是不是应该这样写:
List<TbFiles> fileList = db.TbFiles.Where(tb => userList.Contains(tb.fwUserName)).OrderByDescending(s => s.FileId).ToList();

你上面的回复,是不是相当于对查询结果query进行第二次筛选?实际上和另外一个表没有关系?
冰川711 2019-08-05
  • 打赏
  • 举报
回复
引用 3 楼 red-fly 的回复:
这里的 t,是 s.UserName 的别名?还是 db.TbUsers的别名?这里的s是指定的哪一个?还是笔误(应该写成t)? where t.Id==1 如果有多个条件,之间如何连接?比如 where t.Id==1 and t.UserLevel < userLevel 这样写?
t是db.TbUsers的别名, s改成t 笔误 , 多条件 用 && ||
red-fly 2019-08-05
  • 打赏
  • 举报
回复
引用 2 楼 冰川711 的回复:
3. 改成
var query = (from t in db.TbUsers
select s.UserName).ToList();
这样 query 就是 List<string>类型的了


这里的 t,是 s.UserName 的别名?还是 db.TbUsers的别名?这里的s是指定的哪一个?还是笔误(应该写成t)?

where t.Id==1
如果有多个条件,之间如何连接?比如
where t.Id==1 and t.UserLevel < userLevel
这样写?
冰川711 2019-08-05
  • 打赏
  • 举报
回复
1. 读取全表数据 2. => 符号为 lambda表达式符号, 这个其实就是委托的简写, 想知道var的类型,鼠标移到这个变量上就知道是什么类型了。 3. 改成 var query = (from t in db.TbUsers select s.UserName).ToList(); 这样 query 就是 List<string>类型的了 想要加条件 就 加上 where var query = (from t in db.TbUsers where t.Id==1 select s.UserName).ToList(); 4. where里改成 tb =>query.Contains(tb.fwUserName) 5.这个就是linq 语法,上面的where()也是linq语法,两种实现方式而已 这个from 可以多表联查 这里的uu 就是表db.SysUsers 重命名了而已,类似于sql语法里的 db.SysUsers as uu 想学习 可以搜索 asp.net mvc5+ef6
果然C 2019-08-05
  • 打赏
  • 举报
回复
lambda表达式

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧