tag route page net for data asp all asp.net linq tags

asp.net - route - select asp-for asp-items



consulta de linq para el sistema de etiquetas-búsqueda de múltiples etiquetas (4)

No dice si está usando L2S, L2O, L2E, o qué. Así que aquí hay un método de extensión que funciona para todos. Estoy haciendo algunas conjeturas sobre el diseño de tus objetos, por lo que es posible que tengas que corregir algo de esto.

public static IQueryable<Post> WhereHasAllTags(this IQueryable<Post> posts, IEnumerable<string> tags) { var q = posts; foreach (var tag in tags) { q = q.Where(p => p.Tags.Any(t => t.Name == tag)); } return q; }

Ahora úsalo:

var filtered = Context.Posts.WhereHasAllTags(new [] { "asp.net", "jquery" } );

Tengo dos tablas, Etiquetas (tagid, postid, tagname) y publicaciones (postid, name, ...)
ahora quiero hacer una consulta que me devuelva todas las publicaciones que tienen una cantidad genérica de etiquetas. como: quiero todas las publicaciones que tienen la etiqueta asp.net Y jquery

como dije, la cantidad de etiquetas para buscar es genérica

¿Cómo puedo hacer algo así?

Gracias

actualización 17.11.2009: hay un problema: la relación entre las tablas no existe, porque mi clave principal está en 2 campos (para versionar) ¿cómo puedo hacerlo sin una relación? Estoy usando Linq To Entities

Además, la consulta debería tener un buen rendimiento y no debería generar miles de solicitudes de servidor.


Su mejor opción es investigar en LinqKit para construir dinámicamente predicados. Eso le permitirá unir múltiples predicados, así que simplemente recorrerá las etiquetas para construir la expresión final.

Hay consideraciones especiales si está utilizando Entity Framework contra Linq2SQL, por lo que es un poco difícil publicar el código específico, pero los ejemplos en esa página deberían ser suficientes para orientarlo en la dirección correcta.


IQueryable<Post> FilterByTags(IQueryable<Post> posts, IEnumerable<Tag> tags) { foreach (var tag in tags) { posts = posts.Where(post => post.Tags.Contains(tag)); } return posts; }

El IQueryable<Post> que ingrese tendrá filtros agregados para garantizar que haga referencia a cada Tag en la lista.

Esta es una implementación genérica que puede tener que ajustar dependiendo de su proveedor de LINQ


Supongo que no puedes usar .Contains () usando EF 3.5 con el que he tenido un problema. Lo solucioné usando esta extensión "WhereIn"

''Contiene ()'' solución alternativa utilizando Linq para Entidades?

pon esto en una clase estática, entonces podrías usar algo como:

IQueryable<Post> PostsWithByTags(IEnumerable<string> tagNames) { var postIds = context.Tags.Select(t=>t.postid); foreach (var tag in tagNames) { postIds = context.Tags .WhereIn(t=> t.postid, postIds) .Where(t=>t.tagname == tag); } return context.Tags.Where( t=> t.posId, postIds) }

Realmente creo que deberías considerar tener relaciones entre tus tablas.