varias una tablas tabla son referencias referencia para otro métodos los ejemplos dentro cuáles cruzadas cruzada crear creamos consultas consulta como anidadas .net linq entity-framework entity entity-framework-6

.net - son - Cómo usar Linq para unir tablas de entidades con una tabla de referencias cruzadas



select dentro de otro select linq (1)

Creo que lo que estás buscando es una consulta como esta:

var keywordIds = new List<int> {1, 3, 5, 7, 9}; var items = (from s in db.Items from c in s.Keywords where keywordIds.Contains(c.KeywordId) select s).Distinct();

Si desea traer todos los elementos seleccionados a la memoria, llame al método ToList al final de esta consulta.

Permítanme comenzar con esto diciendo que soy relativamente nuevo en Linq, pero parece que lo he captado bastante rápido. Pero este problema me ha dejado perplejo. He buscado y buscado en vano.

Estoy usando código primero y he creado tengo 2 modelos, "Artículos" y "Palabras clave". Tienen una relación de muchos a muchos. Mis modelos de entidades se ven así:

public class MyContext : DbContext { public MyContext() : base("name=DefaultDatabase") { } protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Mapping Xref table to the correct DB table modelBuilder.Entity<Item>() .HasMany(i => i.Keywords) .WithMany(k => k.Items) .Map(ik => { ik.ToTable("ItemKeywords", "MySchema"); ik.MapLeftKey("ItemId"); ik.MapRightKey("KeywordId"); }); } public virtual DbSet<Item> Items { get; set; } public virtual DbSet<Keyword> Keywords { get; set; } } public class Item { public Item() { Keywords = new List<Keyword>(); } public int ItemId { get; set; } public string Text { get; set; } public virtual List<Keyword> Keywords { get; set; } } public class Keyword { public Keyword() { Items = new HashSet<Item>(); } public int KeywordId { get; set; } public string Name { get; set; } public virtual ICollection<Item> Items { get; set; } }

Por lo que puedo decir, eso es bastante directo. Cuando mis migraciones generan una base de datos, obtengo 3 tablas, "Artículos", "Palabras clave" y una tabla de referencias cruzadas de "ItemKeywords" (que asigné en el método "OnModelCreating").

Lo que estoy teniendo problemas es crear una consulta Linq (sintaxis de consulta o sintaxis de método, no me importa) para reproducir esto:

SELECT DISTINCT i.* FROM Items i INNER JOIN ItemKeywords ik ON i.ItemId = ik.ItemId INNER JOIN Keywords k ON ik.KeywordId = k.KeywordId WHERE k.KeywordId IN (1, 3, 5, 7, 9)

Entonces, básicamente, quiero una Lista de elementos distinta que tenga asignada una de las Palabras clave especificadas.

Creo que puedo hacerlo funcionar al crear un modelo de ItemKeyword, pero parece que vencería primero el punto de código. Añadiría un modelo adicional allí solo por el beneficio de poder consultar en contra de él.

¿Hay alguna manera de hacer que esto funcione sin agregar ese tercer modelo Xref?

¡Gracias!