come dovrebbe passare innerKeySelector?
avere:
model1 - {int model1 Id, int model2Id, model2 Model2}
model2 - {int model2Id, List<model1> modelsRef, ...(other)}
bisogno di fare:
query.Join(context.model2, x => x.Model2, y => y.modelsRef, (x,y) => new{
Id = x.mdel1Id,
(other)...}).Select();
avere errore di compilazione:
{
...
"message": "The type arguments for method 'Enumerable.Join<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, TInner, TResult>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. [ProjectName]",
}
Quindi hai una sequenza di Model2s
, in cui ogni Model2
ha zero o più Model1s
. Ogni Model1
appartiene esattamente a un Model2
, utilizzando la chiave Model1Id
, una relazione uno-a-molti abbastanza standard.
Quando si utilizza il framework di entità si avrà qualcosa di simile a:
class Model2
{
public int Id {set; set;}
// every Model2 has zero or more Model1s:
public virtual ICollection<Model1> Model1s {get; set;}
...
}
class Model1
{
public int Id {set; set;}
// every Model1 belongs to exactly one Model2, using foreign key
public int Model2Id {get; set;}
public virtual Model2 Model1 {get; set;}
...
}
Ricorda:
Nel framework entità le colonne delle tabelle sono rappresentate dalle proprietà non virtuali delle classi. Le proprietà virtuali rappresentano le relazioni tra le tabelle.
Nota: ho modificato l' List<Model1> Model1s
in un modello ICollection<Model1> Model1s
. Dopo tutto, sei sicuro che sia un elenco? Cosa significa Model1s[4]
?
Vuoi unirti a model1s e model2s usando un inner inner join standard:
var result = dbContex.Model1s
.Join(dbContext.Model2s, // join Model1s and Model2s
model1 => model1.Model2Id, // from every Model1 take the foreign key Model2Id
model2 => model2.Id, // from every Model2 take the primary key Id
(model1, model2) => new // when they match use the matching models to create
{ // a new object with the following properties
SomeProperty = model1.PropertyA,
SomeOtherProperty = model2.PropertyB,
MyX = model2.PropertyC,
MyY = model1.PropertyD,
....
});
Diverse persone hanno commentato che non è necessario utilizzare i join quando si utilizza il framework di entità. Hanno ragione. Puoi ottenere lo stesso risultato usando le collezioni. Il risultato sembra più naturale ed è molto più leggibile:
var result = dbContext.Model1s.Select(model1 => new
{
SomeProperty = model1.PropertyA,
SomeOtherProperty = model1.Model2.PropertyB,
MyX = model1.Model2.PropertyC,
MyY = model2.PropertyD,
});
Il framework Entity conosce la tua relazione uno-a-molti e farà il join interiore per te.
Per fare un GroupJoin:
Se hai una relazione genitore-figli uno-a-molti e hai bisogno di certi "genitori con tutti o alcuni dei loro figli", quindi inizia con il genitore e usa l'ICollection per ottenere i bambini. Questo diventerà un GroupJoin .
Per fare un join interno
Se hai bisogno di alcuni "Bambini con i loro genitori", inizia con il Bambino e usa la proprietà Genitore. Questo diventerà un join interiore