2012-05-09 11 views
6

Sono curioso su come creare una proprietà che può essere tradotto da LINQ. Di seguito è un esempio molto semplice.Creazione di una proprietà che LINQ to Entities può tradurre

Ho una tabella/classe di Category, che ha una colonna ParentId collega a se stesso (quindi una categoria può avere sotto-categorie)

EF genera automaticamente una proprietà Category1, che è la categoria principale.

Per motivi di chiarezza, ho creato un'altra proprietà

public partial class Category 
{ 
    public Category Parent 
    { 
    get { return Category1; } 
    } 
} 

Il problema è che questo funziona

var categs = ctx.Categories.Where(x => x.Category1 == null); 

ma questo non funziona

var categs = ctx.Categories.Where(x => x.Parent == null); 

Il il membro del tipo specificato 'Parent' non è supportato in LINQ alle entità. Sono supportati solo gli inizializzatori, i membri dell'entità e le proprietà di navigazione delle entità.

C'è un modo per creare una proprietà traducibile (da LINQ a SQL) senza fare .ToList()?

EDIT: voglio evitare di toccare Model.edmx perché il database cambia spesso durante lo sviluppo e l'edmx spesso deve essere ricreato

+0

è necessario creare una struttura di navigazione da categoria a genitore come chiave esterna –

+0

Ciao a freddo detto, mi dispiace non sono sicuro di quello che vuoi dire. Esiste già una chiave esterna (altrimenti EF non creerà la Categoria1) – Aximili

+0

Hai effettivamente guardato 'Categoria1' in Model.Designer.cs e/o Reflector per vedere quali attributi o altri accessori sono aggiunti alla sua definizione? –

risposta

2

Se si chiede se è possibile creare una proprietà con qualsiasi codice C# nei getter/setter e in seguito averlo compreso dal LINQ standard alle entità - quindi no, non può essere eseguito. C# è molto più espressivo allora SQL ed è irragionevole aspettarsi Entity Framework di agire come un generale C# per SQL traduttore.

È possibile aggirare questo è molti casi, però, vedono Using a partial class property inside LINQ statement per un esempio.

Aggiornamento

Sarebbe utile se lei ci ha detto che cosa esattamente si vuole raggiungere, ma ecco un esempio:

public partial class Category 
{ 
    public static Expression<Func<Category, bool>> ParentIsNullExpression 
    { 
     get 
     { 
      return c => c.Category1 == null; 
     } 
    } 
} 

E poi

var categs = ctx.Categories.Where(Category.ParentIsNullExpression); 

Tutti i tipi di le manipolazioni sulle espressioni sono possibili, alcune sono supportate da EF e come tali si traducono in SQL.

+0

Non può essere fatto in C#? Ma Model.Designer.cs stesso (il file CS per EDMX) è C#, vero ?? Ti riferisci alle proprietà che restituiscono espressioni da quel collegamento? Lo guarderò. – Aximili

+0

Sì, mi riferivo alle proprietà di espressione. Non è il codice di proprietà che lo fa funzionare in Model.Designer.cs, è l'espressione che usi per accedere alla proprietà, ad es. '' c => c.Category''. EF sa che vuoi la proprietà '' Category'' e la traduci nella colonna/tabella '' Category''. –

+0

Mi spiace di non aver mai utilizzato le proprietà dell'espressione. Stai dicendo che è possibile che una proprietà di espressione venga tradotta in SQL? Puoi sostituire la proprietà Parent nella mia domanda con una proprietà Expression in modo che LINQ possa tradurla? Grazie Jacek – Aximili

0

nella tua Designer Entity Data Model (file .edmx), è possibile rinominare la Category1

+0

Questo era solo un esempio molto semplificato. Stavo chiedendo come scrivere una proprietà, non rinominandone una esistente. Grazie comunque. – Aximili

0

Hai 4 opzioni:

  1. Usa codice prima
  2. aggiungerlo al progettista EDMX
  3. Aggiungere la vostra proprietà alla sezione CSDL del EDMX, aggiungere una colonna alla sezione SSDL del EDMX, poi li mappa l'un l'altro nella sezione di mappatura del EDMX.
  4. Portare la query in memoria utilizzando .ToList(), quindi utilizzare LINQ interno anziché LINQ in Entità.
Problemi correlati