178 messaggi dal 26 marzo 2001
Ciao,

sto cercando di trovare un metodo per gestire la localizzazione con Entity Framework 4.0.
Alcune tabelle del mio database hanno record predefiniti localizzati in diverse lingue. In aggiunta, l'utente può aggiungere record personalizzati.

Ho creato una tabella per memorizzare le risorse localizzate con la seguente struttura:

CREATE TABLE dbo.[Resource]
(
[ResourceId] INT IDENTITY(10000,1) NOT NULL,
[Content_it_IT] NVARCHAR(MAX) COLLATE Latin1_General_CI_AS,
[Content_en_GB] NVARCHAR(MAX) COLLATE Latin1_General_CI_AS,
[Content_ja_JP] NVARCHAR(MAX) COLLATE Japanese_CI_AS,

CONSTRAINT PK_Resource PRIMARY KEY ([ResourceId])
)

Il campo ResourceId è un'identity in modo da rendere semplice l'inserimento di nuove entità localizzate (parte da 10000 per avere un range di ID fissi per i record predefiniti).
Inoltre ho una colonna diversa per lingua, in modo da gestire la collation giusta per ogni lingua e quindi avere degli ordinamenti corretti.

Tutte le tabelle che necessitano di record localizzati, avranno un campo ResourceId che è una foreign key alla tabella Resource.

Il mio problema è che vorrei ordinare in base alla UICulture attualmente impostata nella mia applicazione web, direttamente tramite LINQ To Entities:

var sponsorTypes = from s in context.SponsorTypes.Include("Name")
orderby s.Name.Content_ja_JP
select s;

Nella query, SponsorTypes è un entity set mappato su una tabella SponsorType (che contiene le tipologie di sponsor localizzate) mentre Name è una navigation property mappata sulla tabella Resource.

In questo caso ordino per s.Name.Content_ja_JP ma vorrei rendere dinamico questo comportamento in base a Thread.CurrentThread.CurrentUICulture.Name, ad esempio:

var sponsorTypes = from s in context.SponsorTypes.Include("Name")
orderby s.GetContent(Thread.CurrentThread.CurrentUICulture.Name)
select s;

E' possibile tramite LINQ To Entities?
Le Edm Functions possono risolvere questo problema?
Oppure devo passare da Entity SQL?
Hai varie strade:
- ottenere un riferimento all'objectquery completo e aggiungere poi l'order tramite uno switch
var sponsorTypes = context.SponsorTypes.Include("Name"); 
 
switch (Thread.CurrentThread.CurrentUICulture.Name) 
{ 
  case "it-IT": 
   sponsorTypes = sponsorTypes.OrderBy(o => o.Content_it_IT); 
    break; 
.. 
} 

- ottenere un riferimento all'object query e usare il metodo OrderBy che permette di passare come stringa l'ordine
var sponsorTypes = (ObjectQuery)context.SponsorTypes.Include("Name"); 
sponsorTypes = sponsorTypes.OrderBy("Content_" + Thread.CurrentThread.CurrentUICulture.Name); 

Guarda anche questo esempio http://www.linqitalia.com/script/102/Ordinare-Dinamicamente-Query-EntitySQL-Entity-Framework.aspx

- creare un Expression dinamicamente. E' più complicata, dai uno sguardo qua http://blogs.sftsrc.com/stuart/archive/2009/02/19/130.aspx

Ciao

Il mio blog
Homepage
178 messaggi dal 26 marzo 2001
Ho applicato il secondo metodo e funziona perfettamente.
Non ho ben capito però cosa significhi il prefisso "it." nella stringa di OrderBy.

Grazie mille.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
In primo piano

I più letti di oggi

Media
In evidenza
MISC