LINQ问题 - 查询

时间:2010-08-03 15:22:42

标签: linq-to-sql

我有一个表格,可以存储特定键的文化变体。

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

由于

3 个答案:

答案 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子句?