使用linq获取房产

时间:2011-04-01 15:28:12

标签: 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.id.如何在linq中执行此操作?我尝试了以下方式:

ca.name=b.Child.select(x=>x.id.Equals(ca.id)) //here how to map the name property?

5 个答案:

答案 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};