LINQ Izquierda Unirse y unirse Derecho

Necesito ayuda,

Tengo dos tablas de datos llamadas A y B, necesito todas las filas de A y la fila correspondiente de B

Ex:

A: B: User | age| Data ID | age|Growth 1 |2 |43.5 1 |2 |46.5 2 |3 |44.5 1 |5 |49.5 3 |4 |45.6 1 |6 |48.5 

Necesito poner fuera:

 User | age| Data |Growth ------------------------ 1 |2 |43.5 |46.5 2 |3 |44.5 | 3 |4 |45.6 | 

Los datos de ejemplo y el resultado que ha proporcionado no muestran una combinación de la izquierda. Si fuera una unión a la izquierda, su salida se vería así (observe cómo tenemos 3 resultados para el usuario 1, es decir, una vez por cada registro de crecimiento que tenga el usuario 1):

 User | age| Data |Growth ------------------------ 1 |2 |43.5 |46.5 1 |2 |43.5 |49.5 1 |2 |43.5 |48.5 2 |3 |44.5 | 3 |4 |45.6 | 

Suponiendo que todavía requieres una unión a la izquierda; así es como haces un join a la izquierda en Linq:

 var results = from data in userData join growth in userGrowth on data.User equals growth.User into joined from j in joined.DefaultIfEmpty() select new { UserData = data, UserGrowth = j }; 

Si desea hacer una unión correcta, simplemente cambie las tablas que está seleccionando de la siguiente manera:

 var results = from growth in userGrowth join data in userData on growth.User equals data.User into joined from j in joined.DefaultIfEmpty() select new { UserData = j, UserGrowth = growth }; 

La parte importante del código es la statement into, seguida de DefaultIfEmpty . Esto le dice a Linq que queremos tener el valor predeterminado (es decir, nulo) si no hay un resultado coincidente en la otra tabla.

El Doctor Jones mostró la combinación externa izquierda, pero la respuesta correcta sería ligeramente diferente, porque en la pregunta original se deben usar dos tablas vinculadas en el campo de edad para obtener el resultado exactamente como se necesita después del código.

 .... //ctx = dataContext class - not shown here. var user1 = new UserData() { User = 1, Age = 2, Data = 43.5 }; var user2 = new UserData() { User = 2, Age = 3, Data = 44.5 }; var user3 = new UserData() { User = 3, Age = 4, Data = 45.6 }; ctx.UserData.AddRange(new List { user1, user2, user3 }); var growth1 = new UserGrowth() { Id = 1, Age = 2, Growth = 46.5 }; var growth2 = new UserGrowth() { Id = 1, Age = 5, Growth = 49.5 }; var growth3 = new UserGrowth() { Id = 1, Age = 6, Growth = 48.5 }; ctx.UserGrowth.AddRange(new List { growth1, growth2, growth3 }); var query = from userData in ctx.UserData join userGrowth in ctx.UserGrowth on userData.Age equals userGrowth.Age into joinGroup from gr in joinGroup.DefaultIfEmpty() select new { User = userData.User, age = userData.Age, Data = (double?)userData.Data, Growth = (double?)gr.Growth }; Console.WriteLine("{0} | {1} | {2} | {3}", "User", "age", "Data", "Growth"); foreach (var x in query) { Console.WriteLine("{0} | {1} | {2} | {3}", x.User, x.age, x.Data, x.Growth); } .... with following entity classes: public class UserData { [Key] public int User { get; set; } public int Age { get; set; } public double Data { get; set; } } public class UserGrowth { public int Id { get; set; } public int Age { get; set; } public double Growth { get; set; } } 

La forma más fácil es usar Let palabra clave. Esto funciona para mí

 from AItem in Db.A Let BItem = Db.B.Where(x => x.id == AItem.id ).FirstOrDefault() Where SomeCondition Select new YourViewModel { X1 = AItem.a, X2 = AItem.b, X3 = BItem.c } 

Esta es una simulación de Left Join. Si cada elemento en la tabla B no coincide con el elemento A, BItem devuelve nulo