使用 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,否则它将具有适当的 FirstName
和 LastName
属性。
你可以这样写:
var name = context.Students.FirstOrDefault(c=>c.Id == SomeId).FirstName;
我的问题与名为 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,否则它将具有适当的 FirstName
和 LastName
属性。
你可以这样写:
var name = context.Students.FirstOrDefault(c=>c.Id == SomeId).FirstName;