嗨,我正试图在DefaultIfEmpty()上使用IQueryable函数,它抛出了一个异常“用于查询操作符‘DefaultIfEmpty’的不受支持的重载”。这是我的密码:
Dinner defaultDinner = db.Dinners.Where(d => d.DinnerID == 5).Single();
Dinner blah;
IQueryable<Dinner> bla = db.Dinners.Where(d => d.DinnerID == id)
.DefaultIfEmpty(defaultDinner);
blah = bla.First();
return blah;我在没有DefaultIfEmpty的情况下找到了一种不同的方法,但我仍然想知道如何解决这个问题.以下是例外的第一部分:
描述:一个未处理的异常发生在当前web请求的执行过程中。请查看堆栈跟踪以获得有关错误的更多信息,以及它起源于代码的位置。
异常详细信息: System.NotSupportedException:不支持的重载,用于查询操作符'DefaultIfEmpty'.
发布于 2011-08-16 19:59:18
在我看来这似乎是不言自明的:
不支持的重载用于查询运算符“DefaultIfEmpty”
听起来您的LINQ (您还没有指定)不支持DefaultIfEmpty的过载,这是一个默认值。
最简单的选择可能是使用:
var ret = db.Dinners.Where(d => d.DinnerID == id)
.FirstOrDefault();
return ret ?? db.Dinners.Where(d => d.DinnerID == 5).Single();请注意,这种方法避免获取“默认”晚餐,除非它是必需的,因此它也更有效。
(如果任何ID只有一个结果,那么您可能应该使用SingleOrDefault而不是FirstOrDefault。这样更合乎逻辑。)
发布于 2011-08-16 19:57:09
试炼
Dinner dinner = db.Dinners.SingleOrDefault(d => d.DinnerID == id);发布于 2011-08-16 20:04:36
DefaultIfEmpty方法在调用IQueryable<T>时抛出一个IQueryable<T>。您可以通过调用IEnumerable<T>来执行对db.Dinners.Where(d => d.DinnerId == id).ToEnumerable().First()的显式转换。
不过,您可能不应该使用这种方法。最好只检查调用是否返回任何值,如果不返回,则检索默认值。
编辑:Oop.不,乔恩·斯基特是对的。DefaultIfEmpty扩展方法依赖于查询提供程序的实现,因此它肯定取决于所使用的查询提供程序。
https://stackoverflow.com/questions/7084183
复制相似问题