Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq(到SQL)选择左连接默认键_C#_.net_Linq_Linq To Sql_Linq To Objects - Fatal编程技术网

C# 使用Linq(到SQL)选择左连接默认键

C# 使用Linq(到SQL)选择左连接默认键,c#,.net,linq,linq-to-sql,linq-to-objects,C#,.net,Linq,Linq To Sql,Linq To Objects,我有一个最低限度的情况如下:- Table Posts PostID - PK PostDateTime Table LocalisedPosts PostID - JointPK Culture - JointPK LocalisedTitle LocalisedBody 对于区域性为“en”的表POST中存在的PostID,表LocalizedPosts将始终具有匹配项。它可能有其他文化的条目,如“es”、“fr”等 如何构造一个最简单的查询,该查询将返回具有当前区域性(如果可用)或

我有一个最低限度的情况如下:-

Table Posts

PostID - PK
PostDateTime

Table LocalisedPosts

PostID - JointPK
Culture - JointPK
LocalisedTitle
LocalisedBody
对于区域性为“en”的表POST中存在的PostID,表LocalizedPosts将始终具有匹配项。它可能有其他文化的条目,如“es”、“fr”等

如何构造一个最简单的查询,该查询将返回具有当前区域性(如果可用)或默认“en”区域性(如果不可用)的所有帖子

我的思路是:-

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/distinct/first and或什么的,但我不太明白。我用的是“或否则”而不是“尽管”

编辑:我想我现在理解你了,编辑查询以检查你是否有任何当前语言的帖子,如果没有,那么它将搜索英语帖子。您可能需要在let语句中使用fromjoin编写一个完整的查询,我假设您已经建立了正确的关系

像这样的

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

,我不明白为什么会这样;lang应该是当前的文化,为什么它会是空的呢?当然可以,包括查询翻译。生成的SQL看起来还不错。非常感谢。
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 };