您好我正在尝试在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'的不支持的重载。
答案 0 :(得分:14)
对我来说,这似乎很明显:
不支持的重载用于查询运算符'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
。这样就更合乎逻辑了。)
答案 1 :(得分:2)
试试
Dinner dinner = db.Dinners.SingleOrDefault(d => d.DinnerID == id);
答案 2 :(得分:1)
DefaultIfEmpty
方法在NotSupportedException
上调用时会抛出IQueryable<T>
。您可以通过调用IEnumerable<T>
对db.Dinners.Where(d => d.DinnerId == id).ToEnumerable().First()
执行显式转换。
但是你可能不应该使用这种方法。最好只检查调用是否返回任何值,如果没有,则检索默认值。
修改:Oop。不,Jon Skeet是对的。 DefaultIfEmpty
扩展方法依赖于查询提供程序的实现,因此它肯定取决于正在使用的查询提供程序。