使用LINQ获取属性

3

这可能非常简单,只需要一些帮助来正确使用语法!假设我有两个类 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?

你的Child类有什么相关性? - Dan Puzey
5个回答

2
当你说“map”时,你的意思是什么?你想要属性相等的名称吗?从你的示例中可以看出,你的类在访问规范方面有些偏差,并且从你的示例中不确定你的数组名称是否真的是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;
}

或者您可以使用带有 null 合并的 where/select 组合:

var name = b.Child.Where(x => x.id == ca.id)
       .Select(x => x.name)
       .FirstOrDefault() ?? "unknown";

Where() 方法会返回一个范围,如果你想要第一个匹配项(或默认值(对于类为 null),如果没有匹配项),请使用FirstOrDefault()方法。 - James Michael Hare
如何在一条语句中进行空值检查?此外,var name = b.Child.FirstOrDefault(x => x.id == ca.id); 返回对象b,我们无法执行ca.name = name; - user583126
已经修正了错误,你是对的,它确实返回了项目而不是名称。你可以使用FirstOrDefault()返回整个项目--使用较少的链接--或者你可以使用Where/Select/First组合将其缩小到名称。 - James Michael Hare

2
您可能需要使用Where而不是Select

我建议使用FirstOrDefault()而不是where,因为where会给你一个范围,而不是第一个(希望是唯一的)匹配项。 - James Michael Hare
没错,但我可以从问题中看出提问者仍处于早期阶段:基本上是将“Select”误认为是SQL关键字。他可能会期望一个列表结果(就像在SQL中一样)。 - sehe

1

我可能会这样做:

var query = from innerItem in cb.cb
            where item.id.Equals(item.id)
            select innerItem;

if (query != null)
{
    item.name = query.Single().name;
}

敬礼。


0

嗯,除非我误解了你的问题,否则答案相当简单:

     ca.name=b.Child.Where(x=>x.id.Equals(ca.id)).SingleOrDefault().Name; 

可以使用接受谓词的FirstOrDefault重载来消除Where。 - James Michael Hare
1
.SingleOrDefault().Name 没有太多意义。如果你认为可能没有匹配的项,那么在尝试读取 Name 属性之前,应该检查 SingleOrDefault 是否返回了 null。如果你知道总会有匹配的项,那么应该使用 Single。 - Aaron
+1 不要假设 Single() 方法总是能找到结果。你需要处理 Single() 方法抛出的异常,或者检查返回值是否为 null,或者使用 null-coalescing ?? 运算符。 - James Michael Hare

0

使用 join 子句:

var pairs=
    from a in ca    
    join b in cb on a.id equals b.id
    select new {a, b};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接