【问题标题】:Linq complex Inner JoinLinq 复杂内连接
【发布时间】:2020-03-06 08:44:24
【问题描述】:

我想将我的数据与 linq inner join 连接为:

[DataContract]
public class Data
{
    [DataMember(Order = 0, IsRequired = false, EmitDefaultValue = false)]
    public List<DataResultObject> Row { get; set; }
}

[DataContract]
public class DataResultObject
{
    [DataMember]
    public string NAME { get; set; }
    [DataMember]
    public string VALUE { get; set; }
    [DataMember]
    public string TYPE { get; set; }

}

List<Data> follow = (List<Data>)dataset_cache.Get("follow");//364 rows
List<Data> icerik = (List<Data>)dataset_cache.Get("icerik");//134854 rows

List<Data> follow_icerik = icerik.Join(follow,
                i => i.Row.Where(w => w.NAME == "CrawlSourceId").Select(s => s.VALUE),
                f => f.Row.Where(w => w.NAME == "crawl_source_id").Select(s => s.VALUE),
                (i, f) =>
                    new Data
                    {
                        Row = i.Row.Concat(nf.Row).ToList()
                    }
                ).Take(5).ToList();

但它返回空,当我们在“on”子句中有列表时如何使用内连接?

【问题讨论】:

  • 你能用基本的循环来写吗?它会帮助你。另外,你能加一个minimal reproducible example吗?
  • 如果您能提供minimal reproducible example 包括示例数据,那就太好了。
  • 我需要使用linq,sql没有问题。
  • @CanerUnutkan 将您的数据作为 POCO 发布
  • 你可以使用转换为字符串来处理这个String.Join("\0", i.Row.Where(w =&gt; w.NAME == "CrawlSourceId").Select(s =&gt; s.VALUE).OrderBy(o =&gt; o))。但是你绝对应该按照 mjwills 所说的去做才能得到一个好的答案。

标签: c# linq inner-join


【解决方案1】:

试试这个:

List<Data> follow_icerik = icerik.Concat(
                icerik.SelectMany(e => e.Row)
                                 .Where(w => w.NAME == "CrawlSourceId")
                                 .Join(follow.SelectMany(e => e.Row)
                                              .Where(w => w.NAME == "crawl_source_id"),
                i => i.VALUE,
                f => f.VALUE,
                (i, f) =>
                     new List<DataResultObject> { i, f }
                ).Select(e => new Data { Row = e })
).ToList();

编辑:

icerik.SelectMany(e=&gt;e.Row) - 选择包含我们需要的数据的行

icerik.SelectMany(e=&gt;e.Row).Where(w =&gt; w.NAME == "CrawlSourceId") - 过滤此数据

... Join(... - 加入过滤数据

Join 中,我们还必须在加入前过滤数据:follow.SelectMany(e=&gt;e.Row) .Where(w =&gt; w.NAME == "crawl_source_id")

i => i.VALUE, f => f.VALUE, - 我们加入数据的字段。

【讨论】:

  • 在 w.NAME 上出现错误:“List”不包含“NAME”的定义,并且没有扩展方法“NAME”接受“List,"
  • 我编辑了一点并且工作了但结果只加入了列,其他列都没有。新数据 { 行 = 新列表 { i,f } }
  • 解释你想要什么结果,因为从你的问题描述中不清楚。
  • 再次编辑。希望你是需要的。
  • 现在错误是:无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.List' .存在显式转换(您是否缺少演员表?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多