【问题标题】:Get a comma separated list of entity collection using linq使用 linq 获取以逗号分隔的实体集合列表
【发布时间】:2012-05-03 13:50:51
【问题描述】:

我有 2 个实体 LineTag。关系是Line *----* Tag

来自line 我有一个导航属性Line.Tags,它返回一个标签对象列表。 Tag.Name 是后面的字符串值。

我真正需要的是像这样以逗号分隔的方式获取所有标签名称:

tag1, tag2, tag3

我尝试在投影中这样做,但它说它不支持toString()

var o = dgvLines.CurrentRow.DataBoundItem as Order;
                var r = _rs.Lines.Where(y => y.InvoiceNo == o.InvoiceNo).Select(x => new
                {
                    ReturnNo = x.Return.ReturnNo,
                    Part = x.Part,
                    Tags = String.Join(", ", x.Tags.ToList().Select(t => t.Name))
                });
                dgvExistingParts.DataSource = r;

错误:

LINQ to Entities 无法识别方法 'System.String Join(System.String, System.Collections.Generic.IEnumerable`1[System.String])' 方法,并且该方法无法转换为存储表达式。

知道如何获得这个逗号分隔的标签列表吗?

提前致谢。

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:
    var r = _rs.Lines.Where(y => y.InvoiceNo == o.InvoiceNo).ToList().Select(x => new
    {
        ReturnNo = x.Return.ReturnNo,
        Part = x.Part,
        Tags = String.Join(", ", x.Tags.Select(t => t.Name))
    });
    

    【讨论】:

    • 实体框架不支持String.Join。您必须在集合中取回名称,然后在 db 调用后调用 String.Join
    • @MuhammadA:那你可以试试x.Tags.AsEnumerable().Select(t => t.Name)_rs.Lines.Where(...).AsEnumerable().Select(...);
    • @MuhammadA:它可能对性能有不好的影响(你必须检查它,我不知道返回了多少条记录)但尝试在 Select 之前调用 ToList()
    • @MuhammadA:检查我的更新,我的意思是 ToList() 在第一次 Select 之前 - 我更新了代码
    • 这不会从数据库中带回任何x.Tags
    【解决方案2】:

    你不能在 SQL 中进行连接,所以你必须取回你需要的数据,然后在正常的代码中工作:

    var o = dgvLines.CurrentRow.DataBoundItem as Order;
    
    var r = _rs.Lines
      .Where(y => y.InvoiceNo == o.InvoiceNo)
      .Select(x => new
        {
          ReturnNo = x.Return.ReturnNo,
          Part = x.Part,
          TagNames = x.Tags.Select( t => t.Name ),
        }
      )
      .ToList() // this runs the SQL on the database
      .Select( x => new
        {
          ReturnNo = x.ReturnNo,
          Part = x.Part,
          Tags = String.Join( ", ", x.TagNames ),
        }
      )
      .ToList();
    
      dgvExistingParts.DataSource = r;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2023-04-06
      相关资源
      最近更新 更多