我在Linq-To-Entity上使用SingleOfDefault阅读其他关于类似问题的帖子,有些人建议使用“First()”,其他一些建议使用“Extension”方法来实现Single()。
此代码抛出异常:
Movie movie = (from a in movies
where a.MovieID == '12345'
select a).SingleOrDefault();
如果我使用.ToList()将对象查询转换为List,“SingleOrDefault()”实际上可以正常工作而不会抛出任何错误。
我的问题是:转换为List不好吗?是否会出现更复杂查询的性能问题?它在SQL中被翻译了什么?
Movie movie = (from a in movies.ToList()
where a.MovieID == '12345'
select a).SingleOrDefault();
答案 0 :(得分:5)
就linq 2实体团队而言,它在提供商级别上不受支持,但有一些方法可以检查here。
但据我所知,它现在支持.NET 4。
答案 1 :(得分:3)
通常,调用.ToList()或.AsEnumerable()是不好的,因为它会强制查询查询并从SQL获取所有数据。
在你的例子中,.ToList()处于特别糟糕的位置,因为它将获取所有电影。首先执行操作然后执行ToList会更好。
EF4之前EF中最简单的形式是: -
var movie = movies.FirstOrDefault(a => a.MovieID = 12345);
通过将MovieID作为主键在数据库中执行单一操作似乎是确保只有一部电影具有任何给定ID的更好方法。
答案 2 :(得分:1)
LinqToEntities(4)支持SingleOrDefault。
我的假设是您使用的是EF 3.5?
没有简单的方法可以做1或null。
我会写一个使用count的exention,它可以很好地扩展。
public static TElement SingleOrDefault<TElement>
(this IQueryable<TElement> query)
{
if (query.Count() > 1)
{
throw new Exception();
}
return query.FirstOrDefault();
}