Domanda

Date le seguenti tabelle che vorrei restituire il testo localizzato per la data cultura o il testo per la cultura predefinita in cui non esistono fila per la cultura data.

schema http: //lh4.ggpht. com / _gjsCWAV_CZc / ShW6hC-eozI / AAAAAAAACbY / mXaBfiZtBY8 / S400 / diagram.png

Quindi, con i dati Folowing

Risorse

ID  Name
1   Donkey
2   Elephant

LocaleStrings

ID  CultureID  ResID   LocaleText
1   1         1       Donkey
2   1         2       Elephant
3   2         1       baudet

Mi piacerebbe essere in grado di restituire il seguente per la cultura francese

baudet
elephant

Ho provato varie query basata soprattutto SINISTRA SI UNISCE campioni che ho visto, ma mi sono bloccato.

var ct = from r in db.Resources
                 join lt in db.LocaleStrings
                     on r.ID equals lt.ResID into res
                 from x in res.DefaultIfEmpty()
                 select new
                 {
                     CultureID = x.CultureID,
                     LocaleText = x.LocaleText,
                     ResID = x.ResID
                 };

        var text =
            from c in db.Cultures
            join t in ct
            on c.ID equals t.CultureID into cults
            from x in cults.DefaultIfEmpty()
            select x;
È stato utile?

Soluzione

Sono sicuro che c'è un modo migliore, ma questo sembra funzionare:

    var ct =
        from c in db.Cultures
        from l in db.LocaleStrings
        from r in db.Resources
        where r.ID == l.ResID
        select new
        {
            CultureID = c.ID,
            LocaleText = l.CultureID == c.ID ? l.LocaleText : r.Name,
            ResID = r.ID,
            LSID = l.CultureID == c.ID ? l.ID : 0
        };

    var text =
        from t in ct
        where t.LSID != 0 || (t.LSID == 0 && !((from ac2 in ct
                                                where ac2.LSID > 0 && ac2.CultureID == t.CultureID
                                                select ac2.ResID).Contains(t.ResID)))
        select new
        {
            CultureID = t.CultureID,
            LocaleText = t.LocaleText,
            ResID = t.ResID
        };
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top