LINQ是对.NET以来最伟大的改进之一,它可以节省大量的时间和代码行.但是,对于我来说,流畅的语法似乎比查询表达式语法更自然.
var title = entries.Where(e => e.Approved)
.OrderBy(e => e.Rating).Select(e => e.Title)
.FirstOrDefault();
var query = (from e in entries
where e.Approved
orderby e.Rating
select e.Title).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
这两者之间是否有任何区别,或者一方面有什么特别的好处呢?
据我所知,当我使用LINQ扩展方法(使用lambda表达式语法)时IQueryable
,实际上ObjectSet
它们被转换为LINQ to SQL查询.我的意思是那个命令
IQueryable<User> users = db.UserSet;
var users32YearsOld = users.Where(user => user.Age == 32);
Run Code Online (Sandbox Code Playgroud)
与...完全相同
IQueryable<User> users = db.UserSet;
var users32YearsOld = from user in users where user.Age == 32 select user;
Run Code Online (Sandbox Code Playgroud)
因此,它们users32YearsOld
不会在数据库中出现,直到它们被枚举为循环等.(希望我能正确理解这一点).
但是,到底是怎么回事,如果我不掩盖这样的事情发生ObjectSet
的IQueryable
,但作为IEnumerable
?那么它的类型是IEnumerable
什么?
IEnumerable<User> users = db.UserSet;
var users32YearsOld = users.Where(user => user.Age == 32);
Run Code Online (Sandbox Code Playgroud)
它会立即打到数据库(如果是这样的话,那么?在第一行或第二行)?或者它是否会像上一个命令一样,users32YearsOld
在枚举之前不会命中数据库?如果我使用以下代码会有什么不同吗?
IEnumerable<User> users = db.UserSet;
var users32YearsOld = from user in users where user.Age == 32 select …
Run Code Online (Sandbox Code Playgroud) 我想创建一个相当于a的LINQ join语句 Left Join
我的表设置如下:
Recipe
RecipeID
...
Instruction
RecipeID
StepID
SomeFlag
...
Run Code Online (Sandbox Code Playgroud)
等效SQL:
SELECT *
FROM Recipe r
LEFT JOIN Instruction i
ON r.RecipeID = i.RecipeID
AND SomeFlag > 0
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止:
var tmp = db.Recipe
.GroupJoin(
db.Instruction,
r => r.RecipeID,
i => i.RecipeID,
(r, i) => new {r, i},
???);
Run Code Online (Sandbox Code Playgroud)
首先,GroupJoin
这种操作的正确选择是什么?据我所知,Join相当于SQL'Internal Join',而GroupJoin相当于'Left Join'.第二,获得我想要的结果的正确语法是什么?我一直在寻找,我似乎无法使用扩展方法找到合适的答案.
我的项目目前用于"linq"的以下语法
var le = domainModel.EntityDataContext.Table_name_here.Query()
.WithFullReadCheck(domainModel.Security)
.Where(x => x.Metadata.AdvisorID == advisorId).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
据说上面的代码是linq,没有意识到linq我决定学习它.但是,在https://msdn.microsoft.com/en-us/library/gg509017.aspx上,情况完全不同.
我的代码中使用了什么?它是linq的一个版本吗?还有别的吗?
与使用集合Where()方法相比,使用LinQ进行过滤是否有任何区别.
进一步来说,
第一
var numQuery = from num in numbers
where (num % 2) == 0
select num;
Run Code Online (Sandbox Code Playgroud)
第二
var numQuery = numbers.Where(num => num % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
在上面的查询中,哪个更好?是否有任何性能考虑?
谢谢.