`from..where`或`FirstOrDefault`在LINQ [英] `from..where` or `FirstOrDefault` in LINQ

查看:137
本文介绍了`from..where`或`FirstOrDefault`在LINQ的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

传统上,当我试图获取数据从数据库的用户,我用下面的方法(在某种程度上):

Traditionally, when I've tried to get data for a user from a database, and I've used the following method (to some degree):

DbUsers curUser = context.DbUsers.FirstOrDefault(x => x.u_LoginName == id);
string name = curUser.u_Name;
string email = curUser.u_Email;

您可以看到,所有我想要做的就是姓名和电子邮件,但在我看来,这LINQ查询得到的所有存储在用户的数据库,把它放回去,然后让我得到我想要的东西。

You can see that all I want to do is get the Name and Email, but it seems to me that this LINQ query is getting everything stored in the database of that user, bringing it back, then allowing me to get what I want.

我一直在做一些研究,并发现了以下选择:

I have been doing some research and have found the following alternative:

var current = from s in context.DbUsers
where s.u_LoginName == id
select new {
             name = s.u_Name, 
             email = s.u_Email
           };
foreach (var user in current)
{
    //Stuff Here
}

这将是更好的,如果有的话呢?有没有办法使用时,我只想找回一些结果/数据打火机方法?

Which would be better, if any at all? Is there a lighter method to use when I only want to retrieve a few results / data?

推荐答案

如果你想只拿到两个字段,那么你应该在的投影手机实体的查询被执行(在这种情况下查询,当你调用被执行 FirstOrDefault )。使用选择运营商投影匿名对象必需的字段:

If you want to get only two fields, then you should project your entity before query gets executed (and in this case query gets executed when you call FirstOrDefault). Use Select operator for projection to anonymous object with required fields:

var user = context.DbUsers
                  .Where(u => u.u_LoginName == id)
                  .Select(u => new { u.u_Name, u.u_Email })
                  .FirstOrDefault(); // query is executed here

string name = user.u_Name; // user is anonymous object
string email = user.u_Email;

这会生成SQL这样的:

That will generate SQL like:

 SELECT TOP 1 u_Name, u_Email FROM DbUsers
 WHERE u_LoginName = @id

在第二种情况下你之前的做投影的查询被执行(即统计开始)。这就是为什么只有所需的字段被加载。但查询会略有不同(不含 TOP 1 )。其实,如果你将第二个方法转换为lambda语法,这将是几乎相同的:

In second case you are doing projection before query gets executed (i.e. enumeration started). That's why only required fields are loaded. But query will be slightly different (without TOP 1). Actually if you will convert second approach to lambda syntax, it will be almost same:

var query = context.DbUsers
                   .Where(u => u.u_LoginName == id)
                   .Select(u => new { u.u_Name, u.u_Email }); 

// query is defined but not executed yet
foreach (var user in query) // executed now
{
   //Stuff Here
}

和只是为了显示完整的画面,无需投影你得到的第一个各个领域找到用户:

And just to show complete picture, without projection you get all fields of first found user:

DbUsers user = context.DbUsers
                      .Where(u => u.u_LoginName == id)
                      .FirstOrDefault(); // query is executed here

string name = user.u_Name; // user is DbUsers entity with all fields mapped
string email = user.u_Email;    

在这种情况下,用户实体执行查询之前预计不会有,你会得到用户的所有领域从数据库加载并映射到用户实体:

In that case user entity is not projected before query is executed and you'll get all fields of user loaded from database and mapped to user entity:

 SELECT TOP 1 u_LoginName, u_Name, u_Email /* etc */ FROM DbUsers
 WHERE u_LoginName = @id

这篇关于`from..where`或`FirstOrDefault`在LINQ的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆