我搜索过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
答案 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)
尽管Select
,Where
等操作可以转换为查询语法,但是很多扩展方法都不能。在这种情况下,可以使用任何可枚举但不使用查询语法执行First
,Last
,Single
(+ 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
扩展名为空序列设置默认值。