2008-11-12 16 views
10
  • ¿Cómo utilizo un operador?: En la cláusula SELECT de una consulta LINQ? Si esto no se puede hacer, ¿cómo puedo emular uno? El objetivo es obtener un bloque CASE en mi cláusula de selección. Como podría sospechar, recibo un error: Declarador de miembro de tipo anónimo no válido. Los miembros de tipo anónimo deben declararse con una asignación de miembro, nombre simple o acceso de miembro.?: Operador en consulta LINQ

  • ¿Es esta la manera correcta, o una manera suficiente, para decir "de una combinación interna i en a.ipid = i.id join interno u en i.uid = u.id"? Si no, por favor proporcione uno. Gracias.

    var query = 
        from a in db.tblActivities 
        from i in db.tblIPs 
        from u in db.tblUsers 
        select new { 
         u.UserName == null 
          ? i.Address 
          : u.UserName, 
         a.Request, 
         a.DateTime }; 
    

Respuesta

18

Al crear un tipo anónimo (lo que está haciendo con el "nuevo" sin especificar un tipo) debe especificar el nombre del miembro para cada propiedad. De su ejemplo, se vería algo como esto: (también fija su une)

var query = from a in db.tblActivities 
      join i in db.tblIPs on a.ipid equals i.id 
      join u in db.tblUsers on i.uid equals u.id 
      select new { 
       UserName = (u.UserName ?? i.Address), 
       Request = a.Request, 
       Date = a.DateTime 
      }; 

Probablemente se podría hacer el nombre del usuario a su manera, también:

UserName = (u.UserName == null) ? i.Address : u.UserName, 

pero el ?? el operador es más conciso. Es similar a "isnull" en SQL.

+0

Impresionante.Eso estuvo muy cerca, y me llevó a la respuesta: desde a en TblActivities join i en TblIP en a.IPID es igual a i.ID únete a ti en TblUsers en a.UID igual a u.ID selecciona nuevo {UserName = (u.UserName? i.Address), Request = a.Request, Date = a.DateTime} – tsilb

+0

Si ve mi ejemplo, puede omitir las instrucciones de combinación utilizando los alias de la tabla. – LeppyR64

+0

Sin las combinaciones, acaba de implementar una unión cartesiana (producto cruzado). Si cada mesa tuviera 10 filas, obtendría 1000 resultados. Créame, REALMENTE quiere que esas uniones estén allí. – GalacticCowboy

0

Soy bastante nuevo a LINQ to SQL, pero estoy bastante seguro de que sería algo así:

var query = 
    from a in db.tblActivities 
    from i in a.tblIPs 
    from u in i.tblUsers 
    select new 
    { 
     userName = (u.UserName == null) 
      ? i.Address 
      : u.UserName, 
     a.Request, 
     a.DateTime 
    }; 

La sentencia if tiene que estar entre paréntesis y los resultados fuera de ellos. En cuanto a las uniones, sigues la cadena desde uno-> muchos.

1

Debe usar la palabra clave join y definir la relación entre las entidades para realizar una unión interna adecuada.

Here puede encontrar algunos ejemplos al respecto, también le recomiendo que obtenga LinqPad, es una herramienta realmente valiosa para probar sus consultas, también es muy bueno para aprender, tiene más de 200 ejemplos.

+0

Gracias ... +1, nunca escuché de Linqpad, muy útil; ¡Gracias! – tsilb

0

si solo está buscando null, también puede usar ??

string something = null; 
string somethingElse = something ?? "default value"; 

En cuanto a los ejemplos anteriores, es correcto hacer los que van ...

string something = (somethingElse == null ? "If it is true" : "if it is false"); 

no se requieren los parens, pero sí ayuda en la lectura.

+0

Su lógica es buena para la manipulación de cadenas estándar, pero este LINQ solo funciona a medias a la manera en que uno intuitivamente espera ... Mismo error. – tsilb

+0

raro ... Lo he usado en consultas LINQ antes ... la segunda parte es. – Hugoware

0

Realmente. esta pregunta depende de la implementación particular de IQueryable que devolverá su expresión linq. Veo que tiene db.XXX, ¿está utilizando linq para sql o algún linq para almacenar datos? De ser así, la implementación específica de IQueryable necesitará una forma de traducir su expresión a una expresión de tienda. Aparte de los comentarios anteriores, algunos de los otros comentarios son correctos, en un tipo anónimo debe especificar un nombre para cada miembro. Este es realmente tu error.

+0

db en este caso es el DataContext para mi clase de Linq a SQL. – tsilb

+0

Veo, eso tiene sentido. ¿Tiene la respuesta que necesita entre todos estos? – user36784