Pregunta

PetaPoco ha introducido consultas Multi-POCO en forma experimental (por ahora).Como su publicación de blog sugiere y el código que proporciona se ve bien y todo en Cara a cara relaciones cuando cargamos varios POCO por fila, siempre que no se repitan en los registros.

¿Qué sucede cuando al menos un lado está muchos ¿relación?En realidad el código de ejemplo es Muchos a uno datos relacionales.

El código de ejemplo es claramente una relación de muchos a uno.No he probado ningún código de PetaPoco, pero ¿qué hace el código proporcionado en la publicación del blog?¿Todos Article tener su propio User instancia de objeto aunque algunos puedan ser el mismo usuario o comparten la misma instancia de objeto de usuario?

¿Y qué pasa con otros? Muchos tipos de relaciones?¿Cómo funcionan o funcionan?

¿Fue útil?

Solución

Por lo general, yo mismo asigno estas consultas de uno a muchos, como en el siguiente ejemplo.

[TableName("Blogs"), PrimaryKey("BlogId")]
public class Blog {
    public int BlogId {get;set;}
    public string Title {get;set;}

    [Ignore]
    public IList<Post> Posts {get;set;}
}

[TableName("Posts"), PrimaryKey("PostId")]
public class Post {
    public int PostId {get;set;}
    public int BlogId {get;set;}
    public string Subject {get;set;}
    public string Content {get;set;}
}

public class FlatBlogPost {
    public int BlogId {get;set;}
    public string Title {get;set;}
    public int PostId {get;set;}
    public string Subject {get;set;}
    public string Content {get;set;}
}

Hay dos formas de mostrar una lista de publicaciones para un blog o, sin demasiado trabajo, para todos los blogs.

1.Dos consultas:

var Blog = Db.Query<Blog>(1);  
var Posts = Db.Query<Post>("where BlogId = @0", 1);

2.Una consulta =

var flat = Db.Query<FlatBlogPost>("select b.blogid, b.title, p.postid, p.subject, 
           p.content from blogs b inner join posts p on b.blogid = p.blogid where
           b.blogid = @0", 1);

var blog = flat
    .GroupBy(x=> new { x.BlogId, x.Title })
    .Select(x=> new Blog {
        BlogId = x.Key.BlogId,
        Title = x.Key.Title,
        Posts = x.Select(y=> new Post{
                    PostId = y.PostId,
                    BlogId = x.Key.BlogId,
                    Subject = y.Subject,
                    Content = y.Content
                }).ToList()
    });

Sin embargo, normalmente en el número 2 asignaría directamente desde el objeto FlatBlogPost a mi modelo de vista para el cual necesito mostrar los datos.

Actualizar
Consulte estos ayudantes que amplían PetaPoco para admitir consultas básicas uno a muchos y muchos a uno. schotime.net/blog/index.php/2011/08/21/petapoco-one-to-many-and-many-to-one/ https://schotime.wordpress.com/2011/08/21/petapoco-one-to-many-and-many-to-one/

Otros consejos

Mi receta 'Uno para muchos' de Petapoco se encuentra a continuación.Los documentos no son lo suficientemente claros para mí.Cree una conexión de base de datos en Linqpad, le mostrará todas las propiedades de navegación que puede agregar a las clases de Petapoco poco generadas.Ejecute el mismo SQL en Linqpad para asegurarse de que obtenga los datos que espera.

// subclass the generated Parent table pocos, add navigation prop for children
[ResultColumn]  public List<DecoratedChild> Child { get; set; } 

// subclass the generated Child table pocos,  add navigation prop for parent  
[ResultColumn]  public DecoratedParent Parent { get; set; }      

// to get children with parent info
List<DecoratedChild> children = db.Fetch<DecoratedChild, DecoratedParent>(SELECT child.*, parent.* from ...)     

// to get children with parent info, using PetapocoRelationExtensions
List<Child> children = db.FetchManyToOne<Child, Parent>(child => child.ID, "select child.*, parent.* from ...

// to get parents with children info, using PetapocoRelationExtensions              
List<Parent> parents = db.FetchOneToMany<Parent, Child>(par => par.ID, child => child.ID != int.MinValue, "select parent.*, child.* from ...    

Orden de selección de SQL importante, ¡igual que en la lista de tipos de recuperación!los accesorios de navegación tendrán datos de padres o hijos...con 3 niveles la llamada será como:

List<DecoratedGrandChild> grandChildColl = db.Fetch<DecoratedGrandChild, DecoratedChild, DecoratedParent>(SELECT grandch.* , child.*, parent.* from ...)

Personalmente, no creo que puedas evitar otra llamada a la base de datos para obtener los comentarios.Puede obtener una lista de todos los comentarios de los 10 artículos (en el mismo orden en que se almacenan los artículos) utilizando una cláusula IN y recorrerlos en bucle agregándolos a cada artículo.comentarios a medida que avanza y el comentario.artículoid cambia.La única manera que veo de obtener esta información en una sola llamada SQL sería usar una combinación, pero luego obtendrías detalles de artículo duplicados para cada comentario, así que tal vez esto no sea un problema con petapoco, solo una de esas cosas que Nunca seré perfecto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top