使用 lambda 从数据库中提取单个字段

Single field extraction from a database using lambda

我的问题与名为 lambda 的提取方法有关(我在 C# 中使用它)。我有一个数据库,其中有一个名为 Students 的 table,我想知道我是否能够提取 ID 与我的搜索匹配的某些学生的名字和姓氏。

到目前为止,我已经尝试了一些事情,但都没有成功。

我上次尝试的一些代码:

var studentName =
    context.Student //context is the variable with the entities and Student is the table
    .Where(student => student.StudentID == SomeInt) // extract only the one with the chosen ID
    .Select(student => student.FirstName) // tryng only to select the wanted field(s)
    .ToString() // since I want it to be displayed in a textbox

您可以尝试这样的操作:

var student = context.Student 
                     .Where(student => student.StudentID == studentId)
                     .Select(student => new 
                      { 
                          FirstName = student.FirstName, 
                          LastName = student.LastName 
                      }).FirstOrDefault();

如果有 studentId 的学生存在,那么您将得到她的名字和姓氏,如下所示:

var firstName = student.FirstName;
var lastName = student.LastName;

如果给定 studentId 没有任何学生,上述查询的结果将为 null。因此,在您使用 点符号 之前,请确认您正在寻找的用户已经找到,如下所示:

if(student!=null)
{
   // Here you can access both the LastName and 
   // the FirstName of the found student.
}

当前您正在 IQueryable<string> 上调用 Select - 您的查询表示学生名字的 序列 ,即使它只匹配一个一.

如果你只想要一个名字,你可以使用:

var studentName =
    context.Student
           .Where(student => student.StudentID == SomeInt)
           .Select(student => student.FirstName)
           .FirstOrDefault();

然后假设FirstName是一个字符串,你根本不需要ToString()。如果没有学生使用该 ID,则该值将为 null。或者,您可以使用 Single()SingleOrDefault()First()Last()LastOrDefault()。因此,例如,您将使用:

if (studentName == null)
{
    // No match found. Return an error or whatever.
}
else
{
    // Use studentName
}

(你应该只使用 FirstOrDefault() 如果你随后检查是否为空,或者将它传递给其他这样做的东西。否则你可能会在以后得到一个 NullReferenceException,这很难诊断。)

如果您同时想要第一个 个姓氏,则需要更改投影。例如:

var studentName =
    context.Student
           .Where(student => student.StudentID == SomeInt)
           .Select(student => new { student.FirstName, student.LastName })
           .FirstOrDefault();

现在 studentName 的类型将是匿名类型 - 同样,如果没有匹配项,它将为 null,否则它将具有适当的 FirstNameLastName属性。

你可以这样写: var name = context.Students.FirstOrDefault(c=>c.Id == SomeId).FirstName;