2008-12-06 16 views
9

Estoy tratando de hacer un JOIN en Linq usando expresiones lambda ... y encontrando algunos problemas.¿Cómo hacer uniones en Linq usando lambdas y el árbol de expresiones?

Tengo dos entidades, Comentarios y Fuentes de comentarios. Los recursos de comentario están asociados a los comentarios. Tengo el siguiente código, que funciona:

01 IQueryable<Data.Comment> query = ctx.DataContext.Comments; 
02 
03 
04 if (criteria.IsDeleted == DeletedFilter.Deleted) 
05 query = query.Where(row => row.DeletedBy != Guid.Empty); 
06 else if (criteria.IsDeleted == DeletedFilter.NotDeleted) 
07 query = query.Where(row => row.DeletedBy == Guid.Empty); 
08 
09 var data = query.Select(row => CommentInfo.FetchCommentInfo(row)); 

necesito para unirse CommentSources en Comentarios en el campo, y me gustaría utilizar, si es posible, algo así como:

01 query = query.Join(join code goes here) 

¿Cómo puede Hago esto usando lambdas en el árbol de expresiones?

Una cosa más ... ¿cómo agrego una declaración Where the Join?

En lugar de hacer otra pregunta ... ¿cómo podría hacer una cláusula Where en esa unión? Por ejemplo, tengo un campo llamado SourceId en CommentSource que me gustaría filtrar.

Respuesta

15

es necesario especificar cinco cosas (al menos):

  • Las "exteriores" secuencia (Comentarios) (este es el primer parámetro implícito)
  • El "interior" secuencia (CommentSource)
  • Como llegar desde un CommentSource a una tecla
  • Cómo obtener de un comentario a una tecla
  • lo que se quiere que el resultado sea por un par CommentSource/comentario

Por ejemplo:

query = query.Join(ctx.DataContext.CommentSource, 
        comment => comment.CommentSourceId, 
        commentSource => commentSource.Id, 
        (comment, commentSource) 
         => new { Comment=comment, CommentSource=commentSource }); 
+1

voy a aceptar esto como la respuesta ... pero quiero ver si me puede apuntar en la dirección correcta al agregar una declaración Where to the Join para la tabla unida. – mattruma

5

Aquí está mi código final:

  var query = ctx.DataContext.Comments.Join(ctx.DataContext.CommentSources, 
        c => c.CommentId, 
        s => s.CommentId, 
        (c, s) => new {Comment = c, CommentSource = s}); 

      if (criteria.SourceId != null && criteria.SourceId != Guid.Empty) 
       query = query.Where(row => row.CommentSource.SourceId == criteria.SourceId); 

      if (criteria.IsDeleted == DeletedFilter.Deleted) 
       query = query.Where(row => row.Comment.DeletedBy != Guid.Empty); 
      else if (criteria.IsDeleted == DeletedFilter.NotDeleted) 
       query = query.Where(row => row.Comment.DeletedBy == Guid.Empty); 

      var data = query.Select(row => CommentInfo.FetchCommentInfo(row.Comment)); 
Cuestiones relacionadas