我对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)
{
...
}
}
这只选择电子邮件地址,然后如何使用该行并获取名字和姓氏?
先谢谢你。
答案 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;
}