(C#LINQ)使用电子邮件选择名字和姓氏

时间:2016-10-23 05:33:30

标签: c# mysql linq

我对LINQ和SQL查询非常陌生,我已经在网上搜索了大约2个小时,现在试图找到我的问题的答案,这就是我在这里发帖的原因。 / p>

我试图通过使用用户的电子邮件地址来获取用户在LINQ查询中的名字和姓氏。

一个例子是:

using (userEntities db = new userEntities())
{
    var query = from o db.Users
                where o.email == userEmail
                select o;

    if (query.SingleOrDefault() != null)
    {
          ...
    }
}

这只选择电子邮件地址,然后如何使用该行并获取名字和姓氏?

先谢谢你。

3 个答案:

答案 0 :(得分:1)

你有一个db对象,它有一个名为Users的序列,序列中的每个元素都是一个具有名称为email的属性的用户。

显然每个用户还有两个其他属性:firstName和lastName。

在linq中,只要你有一系列“thingies”并且只想要与某个谓词匹配的“thingies”,你就可以使用函数Where,就像你一样。

如果您有一系列的“东西”,并且对于每个“thingie”您想要根据原始的“thingie”创建一个“其他东西”,您可以使用Select函数。将一个输入元素转换为一个输出元素在Linq中称为Projection。使用“选择”功能,可以将输入序列的每个元素投影(转换)为输出序列中的一个元素

因此,如果你想用你的firstName和lastName创建一个“其他东西”,你可以这样做:

class UserName
{
    public string firstName {get; set;}
    public string lastName {get; set;
}
var result = db.Users
    .Where(user => user.email == useremail)
    .Select(user => new UserName()
    {
        FirstName = user.FirstName,
        LastName = user.LastName,
    });

我将每个与userEmail匹配的用户创建一个UserName类的新对象,该对象包含每个用户的FirstName和LastName。

上面使用的方法意味着对于要在Select语句中使用的每个投影,您必须定义一个类。这非常麻烦,特别是如果您只想在非常有限的空间中使用语句的结果,例如仅在您创建新对象的过程中。

如果您不必将查询结果传递给其他函数,并且只需要在此函数中使用它(更确切地说:不需要形式参数),则不必声明类UserName。您可以使用匿名类型。匿名类型可以进行选择,而无需定义您要投射到的类型:

var matchingUserNames = db.Users
    .Where(user => user.email == useremail)
    .Select(user => new
    {
        FirstName = user.FirstName,
        LastName = user.LastName,
    });
foreach (var matchingUserName in matchingUserNames)
{
    Console.WriteLine(matchingUserName.FirstName + ' ' 
        + matchingUserName.LastName);
}

请注意,我遗漏了班级的名称。因此,您无法将结果传递给具有类型名称的内容。实际上你现在唯一关于结果的是它是一个对象序列,其中每个对象都有两个属性:FirstName和LastName。 FirstName与user.FirstName具有相同的类型; LastName与use.LastName

具有相同的类型

对于匿名类型,请参阅the joy of anonymous types

另一篇帮助我了解linq的文章是The standard Linq operators

答案 1 :(得分:0)

query.SingleOrDefault()将返回该行(如果存在)。将其分配给变量并在null检查后使用以获取所需信息。

var query = from o db.Users
            where o.email == userEmail
            select o;

var result = query.SingleOrDefault();
if (result != null)
{
      ... // result.UserName, etc.
}

答案 2 :(得分:0)

query视为数据库的问题,在枚举时,执行查询并返回符合搜索条件的User个集合。

当您执行query.FirstOrDefault()时,您正在枚举查询,要求第一个符合您条件的用户(如果有)。

所以,回答你的问题,你可以这样做:

User user = query.FirstOrDefault();

if (user != null)
{
    var name = user.FirstName + " " + user.LastName;
}