DefaultIfEmpty()不起作用

时间:2011-08-16 19:55:06

标签: c# linq

您好我正在尝试在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'的不支持的重载。

3 个答案:

答案 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扩展方法依赖于查询提供程序的实现,因此它肯定取决于正在使用的查询提供程序。