C# 使用linq获取属性

C# 使用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

这可能真的很简单,但只需要一些帮助,以获得正确的语法! 假设我有两门课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.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;
}