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 };