第一?单?还是默认?

时间:2011-09-06 19:39:03

标签: c# linq entity-framework

我搜索过StackOverflow,但仍然无法理解使用单一,第一(或默认)查询的正确语法。

我愿意进行查询以首先捕获特定语言的翻译。如果数据库中没有这样的翻译,请用英语获取第一个。

这是我到目前为止所得到的:

locale = "ja-jp";

var items = from c in db.Contents.Include("Translation")
            where c.RegionalInfo.Any(x => x.RegionId == locale)
            select c;

修改 Obs。:items是一个IEnumerable

5 个答案:

答案 0 :(得分:4)

尝试这样的事情。

var item = (from c in db.Contents.Include("Translation")
        where c.RegionalInfo.Any(x => x.RegionId == locale)
        select c).FirstOrDefault();
if (item != null)
   ...

答案 1 :(得分:3)

尽管SelectWhere等操作可以转换为查询语法,但是很多扩展方法都不能。在这种情况下,可以使用任何可枚举但不使用查询语法执行FirstLastSingle(+ XXXOrDefault)操作。

因为编译器足够聪明,可以将查询转换为IEnumerable<T>IQueryable<t>的关联结果,所以您只需将查询包装在括号中,然后调用方法:

var item = (from c in dbo.Contents.Include("Translation")
            where c.RegionInfo.Any(x => x.RegionId == locale)
            select c).FirstOrDefault();

......等等。

答案 2 :(得分:1)

或者,如果您更喜欢“非Linq”方法语法,您可以这样做:

var item = dbo.Contents.Include("Translation").FirstOrDefault(m => m.RegionInfo.Any(n => n.RegionId == locale));

答案 3 :(得分:1)

根据你的解释,听起来你想要找到的价值,如果没有找到使用英文翻译。请考虑以下事项:

locale = "ja-jp"; 

var itens = from c in db.Contents.Include("Translation") 
            where c.RegionalInfo.Any(x => x.RegionId == locale) ||
                  c.RegionalInfo.Any(x => x.RegionId == "en")
            order by (c.RegionalInfo.RegionId == "en", "zzzz", c.RegionalInfo.RegionId) 
            select c; 
var foundItem = items.FirstOrDefault();
if (foundItem != null)
{ ... }

这将找到与您的语言环境和英语语言匹配的reocrds,然后通过regionId对结果进行排序,将找到的英语项目放在列表的末尾,然后获取第一条记录(如果找到)。注意:我没有测试此实现,因此请务必检查orderby参数以确保其按设计工作。

答案 4 :(得分:0)

使用DefaultIfEmpty扩展名为空序列设置默认值。