EF初学者的问题,得到某个表中数据,为什么要首先select下

hwyqy 2017-10-10 10:32:18
我是新手,前天刚开始看EF框架
然后发现,在多条件得到某个表中数据的时候(当然有很多种方法),大家会用
using (var context=new ...())
{
var users=form u in context.Users select u;
if (name!="") users=users.Where(....);
if (tel!="") users=users.Where(....);
}


我奇怪的是,为什么我搜索到的示例,都要
var users=form u in context.Users select u;

我直接
var users=context.Users;
然后再调用
if (name!="") users=users.Where(....);
if (tel!="") users=users.Where(....);
也能得到结果,跟踪执行的sql,也没有全表查询,也是自动生成带where条件的T-SQL语句

那为示例中,都要var users=form u in context.Users select u ?
我个人怀疑,是不是以前需要这么写,在2017年的EF6.0下,微软优化了语法?
还请大虾指教下
...全文
1474 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
XBodhi. 2019-09-21
  • 打赏
  • 举报
回复
语法糖而已。
快乐起航2020 2019-09-20
  • 打赏
  • 举报
回复
语法规范吧
快乐起航2020 2019-08-26
  • 打赏
  • 举报
回复
我也刚学Linq 一个多月
快乐起航2020 2019-08-26
  • 打赏
  • 举报
回复
var users=form u in context.Users [条件](不是可以放在这里么) select u;
叫我 Teacher 周 2019-08-21
  • 打赏
  • 举报
回复
你了解一下 SQL 语句的执行顺序再来看看 LINQ
叫我 Teacher 周 2019-08-16
  • 打赏
  • 举报
回复
LINQ 的写法其实就是 SQL 执行的顺序。Select 无非和 sql 中的 select 功能一样,就是要筛选的列
¿?¿? 2019-08-16
  • 打赏
  • 举报
回复
from开头的是linq语法,看起来和sql语法很像 =>是lamdba语法 两种都要学,两种都要会用哦
qq_31015677 2018-09-04
  • 打赏
  • 举报
回复
一种是linq,另一种是lamda 语法不同
丰云 2018-05-24
  • 打赏
  • 举报
回复
linq语法,跟lambda语法,是完全不同的一套语法体系,但都能和c#原生的语法无缝混合使用以及相互混合使用, 因为底层原理和对象基础都是一样的,只是语法不一样而已, 你所谓的迷惑,仅仅因为没听说这两种语法,无法辩证的看待导致的
  • 打赏
  • 举报
回复
哎,如果我们关心不同写法的原理,会更简单,而且自己就能研究和估计可能性了。
  • 打赏
  • 举报
回复
如果你一定要研究几年前的人是否真的刻意区分
var users=form u in context.Users select u;

跟

var users=context.Users;
的区别,那么我觉得你可以研究一下几年前的
context.Users;
返回的数据的类型是什么? 假设那个时候,这个表达式返回类型跟 from ..... select .... 就是相同(相兼容)类型,那么我们就可以知道,那个时候的人本来就可以直接写 context.Users,那么你“搜索到的示例,都要”写成 from ..... 形式可能是“凑巧了”,而并不是不能写。
  • 打赏
  • 举报
回复
var query = from x in array where x.a==1 select x;
根写
var query = array.Where(x=> x.a==1);
主要只是个人体验的区别。 你看的例子的重点在于根据 if 表达式而多次(多层)修改这个 query,最终在 linq 延迟加载机制下,在最终向数据库发送 sql 查询语句时你会看到(调试跟踪到)只有一个编译好的 sql 查询语句发送给数据库。只要做到这一点就达到目的了。
流星亚瑟 2018-02-27
  • 打赏
  • 举报
回复
这个问题是历史问题了,可以追溯到.net 3.0 linq刚问世的时候了,当时还没有EF呢,只有Linq to SQL from u in context.Users select u 的linq 写法 是为了 迎合 sql 语法的,尽可能让 sql 程序员更容易理解 linq 代码 但是也有些不伦不类,如select 语句必须写在后面, join 语句的 equal 而不是 = 等等 个人认为,使用lamda 表达式的linq 扩展方法,更容易理解集合操作,用起来更方便。 但linq的查询语句一直沿用至今
正怒月神 2018-02-07
  • 打赏
  • 举报
回复
var users=form u in context.Users select u; 是linq语法 var users=context.users 是lambda语法。 大同小异
qq_15148111 2018-02-07
  • 打赏
  • 举报
回复
用lamda不是更简单嘛
  • 打赏
  • 举报
回复
引用 6 楼 HtoFire 的回复:
[quote=引用 5 楼 daixf_csdn 的回复:] 为什么用linq,因为多表联合查询时lamda很难写和阅读。
其实我不理解的是,为什么要 var users=form u in context.Users select u; 直接用 var users=context.Users; 也一样的啊[/quote] 这根本不是重点,编程要以测试为准而不是以理论纠结为准。人家的重点在于根据多个 if 语句条件可以分段写最终的 users 查询,最后统一地产生同一个 sql 查询语句给数据库。这里理解就是靠悟性了, 而不是靠抠字眼儿。
  • 打赏
  • 举报
回复
using (var context=new ...())
{
     var users=form u in context.Users where ....... select u;
     if (name!="") users=from u in user where ..... select u;
    if (tel!="") users=from u in user where ..... select u;
}
实际上很可能其实是这样的,而不是你写的那种混合写法。
  • 打赏
  • 举报
回复
如果你把第一段弄得特别简单,然后第二部分、第三部分也比较简单,简单的东西有什么好纠结风格的?没有复杂的需求,其实就看不出来人家当时是出自什么编写习惯了。
圣殿骑士18 2017-10-12
  • 打赏
  • 举报
回复
引用 6楼我是你的主体 的回复:
[quote=引用 5 楼 daixf_csdn 的回复:] 为什么用linq,因为多表联合查询时lamda很难写和阅读。
其实我不理解的是,为什么要 var users=form u in context.Users select u; 直接用 var users=context.Users; 也一样的啊[/quote]有什么不好理解的呢?条条大路通罗马。就我自己的习惯而言,单表的查询我不喜欢用linq,用lamda表达式更清晰,但多表联合查询,我一定能用linq,原则就是代码的可阅读性。
qq_25147077 2017-10-11
  • 打赏
  • 举报
回复
那为示例中,都要var users=form u in context.Users select u ? 我个人怀疑,是不是以前需要这么写,在2017年的EF6.0下,微软优化了语法? -》两种语法方式而已,根据个人代码习惯了,至于为什么select 这就是语法规定,不管哪种方式,最终都会转为Sql语句。
加载更多回复(7)

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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