Вопрос

Учитывая следующие таблицы, я хотел бы вернуть локализованный текст для данной культуры или текста для культуры по умолчанию, где для данной культуры не существует строки.

Диаграмма http://lh4.ggpht.com/_gjscwav_czc/shw6hc-eozi/aaaaaaaacby/mxabfiztby8/s400/diagram.png

Итак, с народными данными

Ресурсы

ID  Name
1   Donkey
2   Elephant

Местные разбросы

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

Я бы хотел вернуть следующее для французской культуры

baudet
elephant

Я пробовал различные запросы, основанные на левых образцах соединений, которые я видел, но я застрял.

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;
Это было полезно?

Решение

Я уверен, что есть лучший способ, но это, кажется, работает:

    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
        };
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top