right multiple left inner ejemplos conditions c# linq entity-framework entity-framework-4 linq-to-entities

c# - multiple - ¿LEFT JOIN en LINQ a entidades?



linq join multiple conditions (5)

Ah, lo tengo yo mismo.
Las peculiaridades y los quarks de las entidades LINQ-2.
Esto parece más comprensible:

var query2 = ( from users in Repo.T_Benutzer from mappings in Repo.T_Benutzer_Benutzergruppen .Where(mapping => mapping.BEBG_BE == users.BE_ID).DefaultIfEmpty() from groups in Repo.T_Benutzergruppen .Where(gruppe => gruppe.ID == mappings.BEBG_BG).DefaultIfEmpty() //where users.BE_Name.Contains(keyword) // //|| mappings.BEBG_BE.Equals(666) //|| mappings.BEBG_BE == 666 //|| groups.Name.Contains(keyword) select new { UserId = users.BE_ID ,UserName = users.BE_User ,UserGroupId = mappings.BEBG_BG ,GroupName = groups.Name } ); var xy = (query2).ToList();

Elimine .DefaultIfEmpty() y obtendrá una combinación interna.
Eso era lo que estaba buscando.

Estoy probando LINQ para las entidades.

Tengo un problema con lo siguiente: quiero que haga esto:

SELECT T_Benutzer.BE_User ,T_Benutzer_Benutzergruppen.BEBG_BE FROM T_Benutzer LEFT JOIN T_Benutzer_Benutzergruppen ON T_Benutzer_Benutzergruppen.BEBG_BE = T_Benutzer.BE_ID

Lo más cercano que he encontrado es esto:

var lol = ( from u in Repo.T_Benutzer //where u.BE_ID == 1 from o in Repo.T_Benutzer_Benutzergruppen.DefaultIfEmpty() // on u.BE_ID equals o.BEBG_BE where (u.BE_ID == o.BEBG_BE || o.BEBG_BE == null) //join bg in Repo.T_Benutzergruppen.DefaultIfEmpty() // on o.BEBG_BG equals bg.ID //where bg.ID == 899 orderby u.BE_Name ascending //, bg.Name descending //select u select new { u.BE_User ,o.BEBG_BG //, bg.Name } ).ToList();

Pero esto genera los mismos resultados que una combinación interna, y no una combinación izquierda.
Además, crea este SQL completamente loco:

SELECT [Extent1].[BE_ID] AS [BE_ID] ,[Extent1].[BE_User] AS [BE_User] ,[Join1].[BEBG_BG] AS [BEBG_BG] FROM [dbo].[T_Benutzer] AS [Extent1] CROSS JOIN ( SELECT [Extent2].[BEBG_BE] AS [BEBG_BE] ,[Extent2].[BEBG_BG] AS [BEBG_BG] FROM ( SELECT 1 AS X ) AS [SingleRowTable1] LEFT OUTER JOIN [dbo].[T_Benutzer_Benutzergruppen] AS [Extent2] ON 1 = 1 ) AS [Join1] WHERE [Extent1].[BE_ID] = [Join1].[BEBG_BE] OR [Join1].[BEBG_BE] IS NULL ORDER BY [Extent1].[BE_Name] ASC

¿Cómo puedo hacer una combinación de izquierda en LINQ-2-entidades de una manera en que otra persona todavía puede entender lo que se está haciendo en ese código?

y más preferiblemente, donde se ve el SQL generado:

SELECT T_Benutzer.BE_User ,T_Benutzer_Benutzergruppen.BEBG_BE FROM T_Benutzer LEFT JOIN T_Benutzer_Benutzergruppen ON T_Benutzer_Benutzergruppen.BEBG_BE = T_Benutzer.BE_ID


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


Puede ser que venga más tarde a responder, pero ahora estoy enfrentando esto ... si ayuda, hay una solución más (la forma en que la resolví).

var query2 = ( from users in Repo.T_Benutzer join mappings in Repo.T_Benutzer_Benutzergruppen on mappings.BEBG_BE equals users.BE_ID into tmpMapp join groups in Repo.T_Benutzergruppen on groups.ID equals mappings.BEBG_BG into tmpGroups from mappings in tmpMapp.DefaultIfEmpty() from groups in tmpGroups.DefaultIfEmpty() select new { UserId = users.BE_ID ,UserName = users.BE_User ,UserGroupId = mappings.BEBG_BG ,GroupName = groups.Name } );

Por cierto, traté de usar el código Stefan Steiger, que también ayuda, pero fue más lento como el infierno.


Puede usar esto no solo en entidades sino también en el procedimiento de almacenamiento u otra fuente de datos:

var customer = (from cus in _billingCommonservice.BillingUnit.CustomerRepository.GetAll() join man in _billingCommonservice.BillingUnit.FunctionRepository.ManagersCustomerValue() on cus.CustomerID equals man.CustomerID // start left join into a from b in a.DefaultIfEmpty(new DJBL_uspGetAllManagerCustomer_Result() ) select new { cus.MobileNo1,b.ActiveStatus });


Puedes leer un artículo que he escrito para enlaces en LINQ here

var query = from u in Repo.T_Benutzer join bg in Repo.T_Benutzer_Benutzergruppen on u.BE_ID equals bg.BEBG_BE into temp from j in temp.DefaultIfEmpty() select new { BE_User = u.BE_User, BEBG_BG = (int?)j.BEBG_BG// == null ? -1 : j.BEBG_BG //, bg.Name }

El siguiente es el equivalente usando métodos de extensión:

var query = Repo.T_Benutzer .GroupJoin ( Repo.T_Benutzer_Benutzergruppen, x=>x.BE_ID, x=>x.BEBG_BE, (o,i)=>new {o,i} ) .SelectMany ( x => x.i.DefaultIfEmpty(), (o,i) => new { BE_User = o.o.BE_User, BEBG_BG = (int?)i.BEBG_BG } );