C# 使用linq获取属性
这可能真的很简单,但只需要一些帮助,以获得正确的语法! 假设我有两门课A,BC# 使用linq获取属性,c#,linq,C#,Linq,这可能真的很简单,但只需要一些帮助,以获得正确的语法! 假设我有两门课A,B class A { string empname; string id; Child[] ca; } class Child { string id; string name; } class B { string empname; string id; Child[] cb; } 我想把ca.name映射到cb.name。条件是cb.id=ca
class A
{
string empname;
string id;
Child[] ca;
}
class Child
{
string id;
string name;
}
class B
{
string empname;
string id;
Child[] cb;
}
我想把ca.name映射到cb.name。条件是cb.id=ca.id。在linq如何做到这一点?我尝试了以下方法:
ca.name=b.Child.select(x=>x.id.Equals(ca.id)) //here how to map the name property?
你可能想在哪里而不是选择地图,你说地图是什么意思?您想要属性相等的名称吗?从您的示例来看,您的类在访问规范方面似乎有点偏离,从您的示例来看,不确定您的数组名是否真的是cb或Child,我将假定为Child,但根据需要更正 基本上有几种选择: Single-仅返回一个,如果没有或多个,则抛出 SingleOrDefault-如果存在,则返回一个,如果不存在,则返回默认值,如果存在多个,则抛出 First-如果存在,则返回第一个,如果不存在,则抛出 FirstOrDefault-如果存在,则返回第一个,如果不存在,则返回默认值 所有这些都有一个谓词重载,因此不需要where子句。如果您已经知道您的项目是唯一的,我建议使用FirstOrDefault,因为它在找到它后会停止,而Single必须扫描整个列表,这可能会有点贵
var item = b.Child.FirstOrDefault(x => x.id == ca.id);
if (item != null)
{
ca.name = item.name;
}
或者,您可以使用带有空合并的where/select组合:
var name = b.Child.Where(x => x.id == ca.id)
.Select(x => x.name)
.FirstOrDefault() ?? "unknown";
嗯,除非我误解了你的问题,否则答案很简单:
ca.name=b.Child.Where(x=>x.id.Equals(ca.id)).SingleOrDefault().Name;
使用条款:
我可能会这样做:
var query = from innerItem in cb.cb
where item.id.Equals(item.id)
select innerItem;
if (query != null)
{
item.name = query.Single().name;
}
注意。您的子类的相关性是什么?如果您想要第一个匹配,那么从哪里可以得到一个范围;如果不匹配,则类的默认值为null;如果不匹配,则使用FirstOrDefaults。我如何在一条语句中进行空值检查?另外,var name=b.Child.FirstOrDefaultx=>x.id==ca.id;返回对象b,我们无法执行ca.name=name;更正了该缺陷,您是对的,它返回的是项目,而不是名称。您可以返回整个项目w FirstOrDefault-使用较少的链接-或者可以使用Where/Select/First组合将范围缩小到名称可以消除Where with FirstOrDefault重载,该重载采用谓词。SingleOrDefault.Name没有多大意义。如果您认为可能没有匹配项,那么在尝试读取Name属性之前,应该检查以确保SingleOrDefault没有返回null。如果你知道总会有一个匹配的项目,你应该使用Single来代替。处理单个异常或检查null或使用null合并??Operator建议使用FirstOrDefault而不是where,因为where给了你一个范围,而不是第一个,希望只有匹配。这是真的,但我可以从问题中看出,asker仍处于早期阶段:本质上,把“Select”错当成了SQL关键字。他可能希望得到类似SQL的列表结果
var query = from innerItem in cb.cb
where item.id.Equals(item.id)
select innerItem;
if (query != null)
{
item.name = query.Single().name;
}