DefaultIfEmpty()不起作用

本文关键字:不起作用 DefaultIfEmpty | 更新日期: 2023-09-27 18:05:52

嗨,我试图在IQueryable上使用DefaultIfEmpty()函数,它抛出了一个异常"不支持的重载用于查询操作符'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请求执行过程中出现未处理的异常。请查看堆栈跟踪以获得有关错误及其在代码中的起源位置的更多信息。

Exception Details: System。NotSupportedException:查询操作符'DefaultIfEmpty'不支持重载。

DefaultIfEmpty()不起作用

这对我来说似乎不言自明:

查询操作符'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。这样更符合逻辑。

Try out

Dinner dinner = db.Dinners.SingleOrDefault(d => d.DinnerID == id);

DefaultIfEmpty方法在调用IQueryable<T>时抛出NotSupportedException。您可以通过调用db.Dinners.Where(d => d.DinnerId == id).ToEnumerable().First()来执行对IEnumerable<T>的显式强制转换。

但是,

您可能不应该使用这种方法。最好只是检查调用是否返回任何值,如果没有则检索默认值。

编辑: Oop。不,乔恩·斯基特是对的。DefaultIfEmpty扩展方法依赖于查询提供程序的实现,因此它肯定取决于正在使用的查询提供程序。