你有一个 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