加入两个列表,并使用linq

时间:2018-08-20 16:19:30

标签: c# asp.net linq

我有以下课程的列表:

public class SiloRelationship
{
    public int RelationshipType { get; set; }
    public string MasterKey { get; set; }
    public string SlaveKey { get; set; }
    public int QueryId { get; set; }
}

我有以下课程的第二个列表:

public class SiloNode
{
    public string Key { get; private set; }
    public string Url { get; private set; }

    public List<NodeQuery> Queries { get; private set; }
}

其中有一个子类:

public class NodeQuery
{
    public string Query { get; private set; }
    public int Seq { get; private set; }
}

列表:

  • LandingSilo.Relationships是SiloRelationship的列表
  • LandingSilo.Nodes是SiloNode的列表。

这是我的查询-有一个简单的联接,此后我需要返回Url和Query属性-过滤器应从列表中生成单个QueryNode。

我们拥有的是:

SiloRelationship => 1 to 1 SiloNode => 1 to many QueryNode 

Kvp足以满足本练习的目的,但是我看不到带有到目前为止的代码的Query属性。

var query =
    from r in LandingSilo.Relationships
    join n in LandingSilo.Nodes on r.SlaveKey equals n.Key
    where r.RelationshipType == 1 &&
    n.Queries.Select(y => y.Seq).Contains(r.QueryId)

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您只需要过滤Queries。如下更改最后一条语句

select n.Queries.FirstOrDefault(q => q.Seq == q.QueryId);

答案 1 :(得分:1)

尝试一下:

IEnumerable<string> queries = LandingSilo.Relationships
    .Where(r => r.RelationshipType == 1)
    .Join(
        LandingSilo.Nodes, 
        r => r.SlaveKey, 
        n => n.Key, 
        (r, n) => n.Queries.SingleOrDefault(q => q.Seq == r.QueryId))
    .Where(q => q != null)
    .Select(q => q.Query);

逐行:过滤类型与Relationship不同的所有1,在SlaveKey / Key上加入并选择节点中唯一具有{ {1}}等于Seq的{​​{1}}。筛选出Relationship个结果,然后选择QueryId属性。如果一个节点内有多个查询,这将引发null

这也可以使用LINQ关键字语法完成,如下所示:

Query