/ / Esquerda Junção Externa em Linq-para-Entidades - entidade-estrutura, linq-para-entidades, junção esquerda

Left Outer Join in Linq-To-Entities - entidade-estrutura, linq-para-entidades, esquerda-junção

Existe uma maneira de fazer uma junção externa esquerda no linq para entidades SEM ter tabelas mapeadas com chaves estrangeiras?

Além disso, se nossa empresa decidir continuar usandolinq para entidades, apesar de todas as suas falhas atuais, você acha importante obter o Visual Studio 2010? Em outras palavras, o que há no Visual Studio 2010 que ajudaria no desenvolvimento de entidades que não estão no Visual Studio 2008?

Obrigado.

Respostas:

1 para resposta № 1

Isso pode não agradá-lo porque os objetos não estão nivelados adequadamente, mas você pode executar uma junção externa e retornar uma coleção de tipos anônimos.

Uma junção externa esquerda é igual à união da junção interna e do conjunto de exceção (a parte do primeiro conjunto que não se une ao segundo conjunto).

Aqui eu simplesmente

  • calcular a junção interna
  • calcule o conjunto de exceções (criando uma entidade B vazia para garantir que os tipos sejam consistentes)
  • combine os dois conjuntos.

O LINQ não é bonito, mas é fofo.

class A
{
public int Id { get; set; }
public string PropertyA { get; set; }
}

class B
{
public int Id { get; set; }
public string PropertyB { get; set; }
}

var aThings = new List<A>();
var bThings = new List<B>();

var innerJoin = aThings.SelectMany(a =>
bThings.Where(b => a.Id == b.Id).Select(b => new { a, b })).ToList();

var exceptSet = aThings.Where(a =>
!bThings.Select(b => b.Id).Contains(a.Id)).Select( a =>
{
B b = new B();
return new { a, b };
});

var outerJoin = innerJoin;
outerJoin.AddRange(exceptSet);

O resultado é uma lista de tipos anônimos {a, b}


-1 para resposta № 2

A Microsoft possui duas equipes de dados que visamo mesmo objetivo: LINQ-to-SQL e entidade ADO.NET. Atualmente, existe suporte para o ADO.NET for Entities, o que significa que o LINQ-to-SQL não será uma prioridade tão alta quanto a oferta do ADO.NET.

O Visual Studio 2010 tem suporte para.NET 4, que por sua vez oferece suporte ao ADO.NET para entidades e ao LINQ-to-SQL. Além do número de recursos de produtividade presentes no VS2010, não tenho visto muito em termos de suporte de dados que seja diferente do VS2008.

Em termos de junção externa esquerda:

var dc = new DataContext();

var query = (
from t1 in dc.MyTable
join a in MyJoinedTable on p.Id equals a.Id into tempTable
from t2 in tempTable.DefaultIfEmpty()
select new { p.Column1, p.Column2, t2.Column1}
);