Obtenga una lista separada por comas de la colección de entidades usando linq

Tengo 2 entidades Line y Tag. la relacion es Line *----* Tag

Desde line Tengo una propiedad de navegación. Line.Tags que devuelve una lista de objetos Tag. El Tag.Name es el valor de la cadena que estoy después.

Lo que realmente necesito es obtener todos los nombres de las etiquetas separados por comas, así:

tag1, tag2, tag3

Traté de hacer esto en una proyección, pero dijo que no es compatible 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;

Error:

LINQ to Entities no reconoce el método 'System.String Join (System.String, System.Collections.Generic.IEnumerable`1 [System.String])', y este método no se puede traducir a una expresión de tienda.

¿Alguna idea de cómo puedo obtener esta lista de etiquetas separadas por comas?

Gracias de antemano.

preguntado el 03 de mayo de 12 a las 14:05

2 Respuestas

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))
});

contestado el 03 de mayo de 12 a las 15:05

Entity Framework no admitirá String.Join. Tendrá que recuperar los nombres en una colección y luego llamar String.Join después de la llamada db. - nick mayordomo

@MuhammadA: Entonces puedes intentar x.Tags.AsEnumerable().Select(t => t.Name) or _rs.Lines.Where(...).AsEnumerable().Select(...); - Oliver

@MuhammadA: puede tener un impacto negativo en el rendimiento (debe verificarlo, no sé cuántos registros se devuelven), pero intente llamar a ToList () antes de Seleccionar - empi

@MuhammadA: verifique mi actualización, quise decir ToList () antes de seleccionar primero - Actualicé el código - empi

Eso no traerá ninguno de los x.Tags de vuelta de la base de datos. - nick mayordomo

No puede hacer la concatenación en SQL, por lo que debe recuperar los datos que necesita y luego trabajar en código normal:

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;

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.