【问题标题】:(C# LINQ) Select firstname and lastname using email(C# LINQ) 使用电子邮件选择名字和姓氏
【发布时间】:2017-03-05 03:17:47
【问题描述】:

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

我正在尝试使用我知道其值的用户电子邮件地址在 LINQ 查询中获取用户的名字和姓氏。

一个例子是:

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

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

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

谢谢你。

【问题讨论】:

  • 它不仅下载电子邮件。它将下载整行。您如何尝试使用该行?
  • 这是登录检查的一部分。那么如何将名字和姓氏从行中提取出来并放入变量中?
  • var user = query.SingleOrDefault(); 然后使用它的属性

标签: c# mysql linq


【解决方案1】:

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】:

query 视为对数据库的一个问题,当被枚举时,它会执行查询并返回一个符合您的搜索条件的Users 集合。

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

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

User user = query.FirstOrDefault();

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

【讨论】:

    【解决方案3】:

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

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

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

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

    因此,如果您想使用您的名字和姓氏创建一个“其他事物”,请执行以下操作:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 2012-01-31
      • 2011-12-16
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2021-09-22
      相关资源
      最近更新 更多