/ / Left Outer Join in Linq-To-Entities: entità-framework, linq-to-entities, left-join

Left Outer Join in Linq-To-Entities: entity-framework, linq-to-entities, left-join

C'è un modo per fare un join esterno sinistro in linq-to-entities senza avere tabelle mappate con chiavi esterne?

Inoltre, se la nostra azienda decide di continuare ad usarelinq-to-entities nonostante tutti i suoi difetti attuali, pensi che sia importante ottenere Visual Studio 2010? In altre parole, cosa c'è in Visual Studio 2010 che aiuterebbe lo sviluppo con entità che non sono in Visual Studio 2008?

Grazie.

risposte:

1 per risposta № 1

Questo potrebbe non soddisfarti perché gli oggetti non sono appiattiti correttamente, ma puoi eseguire un join esterno e restituire una raccolta di tipi anonimi.

Un join esterno sinistro è uguale all'unione dell'unione interna e del gruppo ad eccezione (la parte del primo set che non si unisce al secondo set).

Qui io semplicemente

  • calcola l'unione interna
  • calcola il set tranne (creando un'entità B vuota per garantire che i tipi siano coerenti)
  • combinare i due set.

Il LINQ non è bello, ma è carino.

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);

Il risultato è un elenco di tipi anonimi {a, b}


-1 per risposta № 2

Microsoft ha due team di dati a cui entrambi miranolo stesso obiettivo: entità LINQ-to-SQL e ADO.NET. Il supporto ora si trova con ADO.NET per Entità, il che significa che LINQ-to-SQL non avrà la priorità più alta dell'offerta ADO.NET.

Visual Studio 2010 supporta.NET 4 che a sua volta supporta ADO.NET per le entità e LINQ-to-SQL. A parte il numero di caratteristiche di produttività presenti in VS2010, non ho visto molto in termini di supporto dati diverso da VS2008.

In termini di join esterno sinistro:

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}
);