这可能非常简单,但只需要一些帮助就可以正确理解语法! 假设我有两个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?
答案 0 :(得分:2)
您可能需要Where
而不是Select
答案 1 :(得分:2)
当你说地图时,你是什么意思?你想要财产相等的名字吗?从您的示例中访问规范来看,您的类似乎有点偏离,并且从您的示例中不确定您的数组名称是否真的是cb或Child,我将假设Child,但必要时更正......
基本上有几种选择:
Single()
- 只返回一个,如果没有或多个则抛出。
SingleOrDefault()
- 如果存在则返回1,否则返回默认值,如果存在则返回
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";
答案 2 :(得分:1)
我可能会这样做:
var query = from innerItem in cb.cb
where item.id.Equals(item.id)
select innerItem;
if (query != null)
{
item.name = query.Single().name;
}
问候。
答案 3 :(得分:0)
ca.name=b.Child.Where(x=>x.id.Equals(ca.id)).SingleOrDefault().Name;
答案 4 :(得分:0)
使用join子句:
var pairs=
from a in ca
join b in cb on a.id equals b.id
select new {a, b};