我有一个表格,可以存储特定键的文化变体。
RecordID Key CultureID Description 1 1 en-GB Hour 2 1 es-ES hora 3 2 en-GB Swimming
我将此作为IEnumerable给出@ CultureID =“es-ES”的参数我想返回以下内容。简而言之,如果文化变体存在,则将其返回给定参数,否则返回“en-GB”条目(其中Allways Exists)。有人可以帮我处理LINQ查询。
RecordID Key CultureID Description 2 1 es-ES hora 3 2 en-GB Swimming
由于
答案 0 :(得分:2)
您可以使用布尔值排序为[false,true]的事实,因此以下查询将首先排序所有匹配而不是等于en-GB
,然后en-GB
var result = (from x in variants
where x.CultureID == cultureID || x.CultureID == "en-GB"
orderby x.CultureID == "en-GB"
select x).First();
如果给定密钥(First
至少需要一条记录)存在任何“en-GB”条目,则此查询将给出错误,但如您所述,它始终存在。如果您不确定,请使用FirstOrDefault
。
请注意,许多LINQ提供程序都支持这种习惯用法,它不仅可用于IEnumerable / Lists。所以你甚至可以将关键字和文化的过滤器结合起来作为LINQ查询的一部分,这样你就可以让数据库为你排序,而你却没有得到整个翻译列表,只需要你想要的那个:< / p>
var result = (from x in db.Translations
where x.Key == someKey
&& (x.CultureID == cultureID || x.CultureID == "en-GB")
orderby x.CultureID == "en-GB"
select x).First();
答案 1 :(得分:1)
总有另一种方式。
<强>联:强>
IEnumerable<Varriant> result = variants
.Where(x=>x.CultureID == CultureID)
.Union(variants.Where(x=> x.CultureID == "en-GB"))
.ToList();
Variant v = variants.FirstOrDefault();
其他强>
IEnumerable<Varriant> result = (
from x in variants
where x.CultureID == CultureID || x.CultureID == "en-GB"
select x
).ToList();
Varriant r = null;
if(result.Length <= 1){
r = result.FirstOrDefault();
}else{
r = result.First(x=>x.CultureID !="en-GB");
}
答案 2 :(得分:0)
我认为你必须提出两个问题。一个尝试获取文化变体的值(使用SingleOrDefault()),然后检查返回的值是否为null。如果是,请使用en-BG执行相同的查询,而不是作为参数给出的查询。
var result = (from i in records where RecordID = 1 && CultureID = "es-ES" select i).SingleOrDefault();
if (result == null) result = = (from i in records where RecordID = 1 && CultureID = "es-ES" select i).Single();
或者也许使用一些orderby子句?