Выбор ключа по умолчанию для левого соединения с помощью Linq (для SQL) - PullRequest
0 голосов
/ 21 июня 2011

У меня есть минимальный регистр следующим образом: -

Table Posts

PostID - PK
PostDateTime

Table LocalisedPosts

PostID - JointPK
Culture - JointPK
LocalisedTitle
LocalisedBody

В таблице LocalisedPosts всегда будет соответствующая запись для PostID, который существует в таблице Posts с культурой "en".Он может содержать записи для других культур, таких как «es», «fr» и т. Д.

Как создать простейший запрос, который будет возвращать все сообщения с текущей культурой, если она доступна, или, если нетdefault "en" culture.

Я думал так: -

string lang = "fr" // lang is supposed to be the current culture (i.e. Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName)

var LocalisedPosts = 
    from p in Posts
    join pl in LocalisedPosts on p.PostID == pl.PostID
    where pl.culture == lang || pl.culture == "en"
    select new {p.PostID, p.PostDateTime, pl.LocalisedTitle, pl.LocalisedBody};

Но это приведет к записи для "fr" и "en" в некоторых строках.Я думаю, мне нужно использовать orderby / Different / First и / или что-то еще, но я не могу понять это.Я использую "Или Остальное", а не "Или", хотя.

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Как то так?

var restult = (
    from p in Posts
    let localizedPost = (
        from pl in LocalisedPosts
        where p.PostID == pl.PostID && (pl.culture == lang || pl.culture == "en")
        let culturePriority = pl.culture == lang ? 0 : 1
        orderby culturePriority
        select pl)
        .First()
    select new { p.PostID, p.PostDateTime, localizedPost.LocalisedTitle, localizedPost.LocalisedBody };

Предполагается, что для каждого сообщения существует хотя бы один локализованный пост en или lang.

0 голосов
/ 21 июня 2011
String lang = "fr"

var LocalisedPosts = 
    from p in Posts
    let anyWithCurrentLang = (Posts.Any(ps=>ps.LocalisedPost.Culture == lang))
    join pl in LocalisedPosts on p.PostID == pl.PostID
    where pl.culture == lang || (pl.culture == "en" && !anyWithCurrentLang )
    select new {p.PostID, p.PostDateTime, pl.LocalisedTitle, pl.LocalisedBody};

Отредактировано: я думаю, что теперь я вас понимаю, отредактировал запрос, чтобы проверить, есть ли у вас какие-либо посты с текущим языком, если нет, то он будет искать английские. Возможно, вам понадобится написать полный запрос с использованием оператора where в операторе let, я предположил, что вы уже установили правильные отношения.

...