Tengo problemas con una consulta escrita en LINQ y Lambda. Hasta ahora, recibo muchos errores aquí está mi código:
int id = 1;
var query = database.Posts.Join(database.Post_Metas,
post => database.Posts.Where(x => x.ID == id),
meta => database.Post_Metas.Where(x => x.Post_ID == id),
(post, meta) => new { Post = post, Meta = meta });
Soy nuevo en el uso de LINQ, por lo que no estoy seguro de si esta consulta es correcta.
Respuestas:
Creo que si está familiarizado con la sintaxis SQL, el uso de la sintaxis de consulta LINQ es mucho más claro, más natural y facilita la detección de errores:
Sin embargo, si realmente está atascado en el uso de lambdas, su sintaxis está bastante apagada. Aquí está la misma consulta, utilizando los métodos de extensión LINQ:
fuente
lambda
y es cita fácil de usar y entenderPodrías ir de dos maneras con esto. Usando LINQPad (invaluable si eres nuevo en LINQ) y una base de datos ficticia, construí las siguientes consultas:
o
En este caso particular, creo que la sintaxis de LINQ es más limpia (cambio entre los dos dependiendo de cuál sea más fácil de leer).
Sin embargo, lo que me gustaría señalar es que si tiene claves foráneas apropiadas en su base de datos (entre post y post_meta), probablemente no necesite una unión explícita a menos que esté intentando cargar una gran cantidad de registros . Su ejemplo parece indicar que está intentando cargar una sola publicación y son metadatos. Suponiendo que hay muchos registros post_meta para cada publicación, puede hacer lo siguiente:
Si desea evitar el problema n + 1, puede decirle explícitamente a LINQ to SQL que cargue todos los elementos relacionados de una vez (aunque este puede ser un tema avanzado para cuando esté más familiarizado con L2S). El siguiente ejemplo dice "cuando cargue una publicación, también cargue todos sus registros asociados con ella a través de la clave externa representada por la propiedad 'Post_metas'":
Es posible hacer muchas
LoadWith
llamadas en un solo conjuntoDataLoadOptions
para el mismo tipo, o muchos tipos diferentes. Sin embargo, si hace esto mucho, es posible que desee considerar el almacenamiento en caché.fuente
Daniel tiene una buena explicación de las relaciones de sintaxis, pero preparé este documento para mi equipo para que sea un poco más sencillo de entender. Espero que esto ayude a alguien
fuente
Post_ID
campo en el segundo aliasmeta => meta.Post_ID
. En el ejemplo de esta ilustración, lag.id
parte de la instrucción select originalJOIN gStatus g on g.id
no se replica en la expresión final de Lambda.public class IdHolder{ int id }
luego hubiera usado ese objeto en el gStatus,List<IdHolder> gStatus = new List<IdHolder>(); gStatus.add(new IdHolder(){id = 7}); gStatus.add(new IdHolder(){id = 8});
entonces habría cambiado el Linq parat =>t.value.TaskStatusId, g=>g.id
que ese cambio tenga sentido.Sus selectores clave son incorrectos. Deben tomar un objeto del tipo de tabla en cuestión y devolver la clave para usar en la unión. Creo que te refieres a esto:
Puede aplicar la cláusula where después, no como parte del selector de teclas.
fuente
Publicando porque cuando comencé LINQ + EntityFramework, miré estos ejemplos por un día.
Si está utilizando EntityFramework, y tiene una propiedad de navegación nombrada
Meta
en suPost
objeto modelo configurado, esto es muy fácil. Si está utilizando una entidad y no tiene esa propiedad de navegación, ¿qué está esperando?Si está haciendo código primero, configuraría la propiedad de esta manera:
fuente
He hecho algo como esto;
fuente
Podría ser algo como
fuente
1 es igual a 1 dos tablas diferentes se unen
fuente
Esta consulta linq debería funcionar para usted. Obtendrá todas las publicaciones que tengan meta meta.
Consulta SQL equivalente
fuente