2011-08-16 10 views
8

Hola, estoy tratando de usar la función DefaultIfEmpty() en IQueryable y está lanzando una excepción "Sobrecarga no admitida utilizada para el operador de consulta 'DefaultIfEmpty'." este es mi código:DefaultIfEmpty() no funciona

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; 

he encontrado una manera diferente de hacerlo sin DefaultIfEmpty pero todavía quiero saber cómo resolver esto ... aquí es la primera parte de la excepción:

Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.NotSupportedException: Sobrecarga no admitida utilizada para el operador de consulta 'DefaultIfEmpty'.

Respuesta

14

Parece bastante explica por sí mismo para mí:

sobrecarga no compatible utilizado para operador de consulta 'DefaultIfEmpty'

Suena como su proveedor de LINQ (que no ha especificado) no es compatible con la sobrecarga de DefaultIfEmpty que tiene una desventaja valor de ULT

La alternativa más sencilla es probablemente usar:

var ret = db.Dinners.Where(d => d.DinnerID == id) 
        .FirstOrDefault(); 
return ret ?? db.Dinners.Where(d => d.DinnerID == 5).Single(); 

Tenga en cuenta que este enfoque evita ir a buscar la cena de "default" a menos que sea necesario, por lo que es más eficiente también.

(Si sólo debe haber un resultado único para cualquier identificación, probablemente debería utilizar SingleOrDefault en lugar de FirstOrDefault por cierto. Es más lógico de esa manera.)

+0

Estoy usando: system.data.linq.table –

+0

@Ella: So LINQ to SQL entonces ... –

+0

Sí, linq a sql db –

2

Pruebe

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

¿Qué método 'Default' es ese? No estoy familiarizado con esto en Queryable ... –

+0

El problema aquí es que el '' Default'' devuelto por '' SingleOrDefault'' es el valor predeterminado * para ese tipo *. En este caso, dado que '' Dinner'' es una clase, sería '' null''. – BishopRook

+0

@Jon Skeet: eliminado esto ya, lo he mezclado con algo que no recuerdo exactamente ... pero en algún lugar vi tal sintaxis – sll

1

El método DefaultIfEmpty tiros un NotSupportedException cuando se le llama en una IQueryable<T>. Puede realizar un lanzamiento explícito a IEnumerable<T> llamando al db.Dinners.Where(d => d.DinnerId == id).ToEnumerable().First().

Probablemente no debería usar este método, sin embargo. Es mejor simplemente verificar si la llamada devolvió algún valor, y recuperar el valor predeterminado si no lo hizo.

Editar: Oop. No, Jon Skeet tiene razón. El método de extensión DefaultIfEmpty se basa en una implementación del proveedor de consultas, por lo que definitivamente depende de qué proveedor de consultas se esté utilizando.

+0

Seguramente si arroja una excepción depende de la * implementación * de IQueryable . No hay nada que le impida manejar ese operador sin problemas. –

+0

'' DefaultIfEmpty'' es un método de extensión en '' System.Linq'', no es un miembro de la clase que implementa '' IQueryable '' * o * '' IEnumerable ''. Entonces, no, no veo cómo importaría la implementación. – BishopRook

+0

Es un método de extensión en Queryable, yes - que hace llamadas en 'IQueryable ' en el primer parámetro. La implementación tiene * muy * mucha importancia. Por ejemplo, intente 'string y = new string [0] .AsQueryable(). DefaultIfEmpty (" foo "). First();' - eso tendrá éxito sin problemas, a pesar de seguir llamando 'Queryable.DefaultIfEmpty'. –