30 messaggi dal 30 gennaio 2014
Buonasera,
Spero di non postare la domanda nel forum sbagliato, tuttavia vorrei risolvere un problema che incontro con alcuni dati.
Ho trovato e personalizzato un esempio di localizzazione con gestione delle risorse nel database, però vorrei visualizzare le stesse come tabella pivot in modo da poterle gestire meglio (intendo le traduzioni).
Le mie entità sono;

public partial class StringResource
    {
        public int Id { get; set; }
        public int? LanguageId { get; set; }
        [StringLength(100)]
        public string Name { get; set; }
        [StringLength(100)]
        public string Value { get; set; }

        public virtual Language Language { get; set; }
    }


public partial class Language
    {
        public Language()
        {
            StringResources = new HashSet<StringResource>();
        }
        public int Id { get; set; }
        [StringLength(100)]
        public string? Name { get; set; }
        [StringLength(10)]
        public string? Culture { get; set; }
        public virtual ICollection<StringResource> StringResources { get; set; }
    }

Il mio problema non è estrarre i dati dal DB (uso entity framework), ma rappresentarli in pivoting...
Vorrei poterle visualizzare in una tabella più o meno come segue:
StringResource.Name | Lingua1 | Lingua 2 | ... | Lingua n !|

In modo che, nel momento che aggiungerò una nuova lingua per il sito il sistema mi presenterà la relativa colonna tale da poter lavorare da web app anzichè direttamente sul DB...

Ho constatato che EF non effettua il pivoting e vorrei sapere se mi potete indicare eventualmente un sistema per ovviare (magari indicandomi la libreria più conveniente)...

Valter
30 messaggi dal 30 gennaio 2014
Dopo aver tirato un po' di capocciate ho trovato il bandolo della matassa mischiando un po' di EF ed un po' di System.Data....
Se a qualcuno potesse interessare (o se ha una soluzione più interessante della mia):
Il viewmodel
 public class ResourcesViewModel
    {
        public DataTable? Colonne { get; set; }
    }

il servizio:

public ResourcesViewModel GetResourcesTable()
        {
            DataTable dt = new();

            using (var command = dbContext.Database.GetDbConnection().CreateCommand())
            {
                command.CommandText = "SET @sql = NULL;" +
                    "SELECT " +
                    "GROUP_CONCAT(DISTINCT CONCAT( " +
                    " ' MAX(CASE WHEN LanguageId = ', LanguageId, ' THEN Value ELSE \"\" END) AS \"', LanguageId, '\"'))" +
                    "INTO @sql FROM t_stringresources;" +
                    "SET @sql = CONCAT('SELECT name, ', @sql, " +
                    " ' FROM t_stringresources GROUP BY name');" +
                    "PREPARE stmt FROM @sql;" +
                    "EXECUTE stmt;" +
                    "DEALLOCATE PREPARE stmt;";
                dbContext.Database.OpenConnection();
                using (var reader = command.ExecuteReader())
                {
                    dt.Load(reader);
                }

            }
            //TODO: qui bisogna poi passare le intestazioni delle colonne per cambiare i numeri in lingua

            ResourcesViewModel model = new()
            {
                Colonne = dt
            };
            return model;
            

            
        }


la view dinamica (ometto il controller in quanto è la classica chiamata all'interfaccia):
@model ResourcesViewModel
@{
}
<div class="row">
    <div class="col">
        <table class="table table-dark table-striped table-hover">
            <thead>
                <tr>
                @for(int i = 0; i < Model.Colonne.Columns.Count; i++)
                {
                    <th scope="col">@Model.Colonne.Columns[i].ColumnName</th>
                }
                </tr>
            </thead>
            <tbody>
                @foreach(DataRow row in Model.Colonne.Rows)
                {
                    <tr>
                        @for (int i = 0; i < Model.Colonne.Columns.Count; i++)
                        {
                            <td>@row[i].ToString()</td>
                        }
                    </tr>
                }
            </tbody>
        </table>
    </div>
</div>

Valter

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.