sábado, 25 de junio de 2022

InvalidOperationException: Unable to translate collection subquery in projection since the parent query doesn't project key columns of all of it's tables which are required to generate results on client side. This can happen when trying to correlate on keyless entity or when using 'Distinct' or 'GroupBy' operations without projecting all of the key columns.

 Este problema es uno de los cambios más importantes en EF Core 5.0. Algunas consultas con colección correlacionada que también usan Distinct o GroupBy ya no son compatibles.

Ya no se admiten algunas consultas con colecciones correlacionadas que también usan Distinct o GroupBy

Comportamiento anterior

Anteriormente, las consultas que implicaban colecciones correlacionadas seguidas de GroupBy, así como algunas consultas con Distinct que permitimos ejecutar.

Ejemplo de GroupBy:

C#
context.Parents
    .Select(p => p.Children
        .GroupBy(c => c.School)
        .Select(g => g.Key))

Ejemplo de Distinct: en concreto, las consultas Distinct en las que la proyección de la colección interna no contiene la clave principal:

C#
context.Parents
    .Select(p => p.Children
        .Select(c => c.School)
        .Distinct())

Estas consultas podrían devolver resultados incorrectos si la colección interna contuviera duplicados, pero funcionaría correctamente si todos los elementos de la colección interna fueran únicos.

Comportamiento nuevo

Estas consultas ya no son compatibles. Se produce una excepción que indica que no hay suficiente información para compilar los resultados correctamente.

Por qué

En el caso de los escenarios de colecciones correlacionadas, es necesario conocer la clave principal de la entidad para asignar entidades de colección al elemento primario correcto. Cuando la colección interna no utiliza GroupBy ni Distinct, la clave principal que falta se puede agregar simplemente a la proyección. Sin embargo, en el caso de GroupBy y Distinct, no se puede hacer porque cambiaría el resultado de la operación GroupBy o Distinct.

Mitigaciones

Vuelva a escribir la consulta para que no use las operaciones GroupBy o Distinct en la colección interna y, en su lugar, realice estas operaciones en el cliente.

C#
context.Parents
    .Select(p => p.Children.Select(c => c.School))
    .ToList()
    .Select(x => x.GroupBy(c => c).Select(g => g.Key))
C#
context.Parents
    .Select(p => p.Children.Select(c => c.School))
    .ToList()
    .Select(x => x.Distinct())

lunes, 20 de junio de 2022

URL Routing asp.net 4.8 Web Forms

mvc routing

Para implementar el enrutamiento de URL necesitaremos registrar las rutas que necesitamos usar en nuestra aplicación.

Para hacerlo,busca la clase RouteConfig ubicada en la carpeta App_Start:







Dentro del método RegisterRoutes, he utilizado el método MapPageRoute que acepta los siguientes tres parámetros.
1. routeName : Nombre de la Ruta. Debe ser único para cada ruta. Puede establecer cualquier nombre único, lo he llamado Clientes para una mejor comprensión.
2. routeUrl : la URL de la ruta que desea implementar. Por ejemplo, aquí queremos que NombresDetalle.aspx aparezca solo como NombresDetalle(sin la extensión .ASPX), por lo que esta personalización debe definirse aquí.

3. archivo físico : la URL de la página ASP.Net real a la que se debe redirigir la URL de la ruta. Para este ejemplo, es NombresDetalle.aspx.

 public static void RegisterRoutes(RouteCollection routes)
        {

            routes.MapPageRoute("NombresDetalle", "NombresDetalle/{NombreId}",        "~/NombreDetalle.aspx");
            var settings = new FriendlyUrlSettings();
            settings.AutoRedirectMode = RedirectMode.Permanent;
            routes.EnableFriendlyUrls(settings);
        }

En la pagina donde va invocar la llamada a la pagina detalle:

    <asp:HyperLinkColumn HeaderText = "Nombre" DataNavigateUrlFormatString = "~/NombresDetalle/{0}" DataNavigateUrlField="NombreId" DataTextField = "NombreId" />






Para obtener el paramatro mandado a la pagina detalle:
 public partial class NombreDetalle : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                NombreId.Text = this.Page.RouteData.Values["NombreId"].ToString();
            }
        }
    }


domingo, 19 de junio de 2022

No se puede utilizar .. inicial para salir por encima del directorio superior.


No se puede utilizar .. inicial para salir por encima del directorio superior.


 

El problema radica en las rutas relativas "../" de la master page:


Se tendrían que cambiar por rutas fijas o utilizar: "~/"



Cómo ver detalles completos de errores de ASP.NET, deshabilitar errores personalizados

 Cómo ver detalles completos de errores de ASP.NET, deshabilitar errores personalizados

Si su aplicación arroja errores, pero no puede ver el mensaje de error completo, puede deshabilitar customErrors.









Para hacer esto, querrá configurar el modo customErrors en "Off" como se muestra a continuación. Tenga cuidado, ya que esto podría exponer la información confidencial que se muestra en los mensajes de error, así como los seguimientos detallados de la pila. Esto no se recomienda a menos que no tenga otra opción y debe volver a cambiarlo lo antes posible.

<configuration>
  <system.web>
    <customErrors mode="Off"/>
  </system.web>
</configuration>

SQL Server Order by random, Ordenamiento aleatorio

 Order by random sql

Requiero ordenar una consulta de manera aleatoria, es decir que siempre me regrese un resultado diferente:











La función NEWIDdevuelve un uniqueidentifiertipo de datos que representa un GUID de 16 bytes. Por lo tanto, cada nuevo valor devuelto por la funciónNEWID será prácticamente único.


1
2
3
4
SELECT
    NombreId
FROM nombre
ORDER BY NEWID()

jueves, 16 de junio de 2022

Cannot truncate table 'XXXX' because it is being referenced by a FOREIGN KEY constraint.

 Cannot truncate table 'esquema.tutabla' because it is being referenced by a FOREIGN KEY constraint

Error:

Msg 4712, Level 16, State 1, Line 1

Cannot truncate table 'esquema.tutabla' because it is being referenced by a FOREIGN KEY constraint.


Solucion, primero tienes que eliminar las dependecias hijas de la tabla, despues ejecuta el siguiente script:

unicamente tienes que llenar el esquema y el nombre de tu tabla a truncar

DECLARE @Debug bit = 0;

-- List of tables to truncate
select
    SchemaName, Name
into #tables
from (values 
    ('esquema''tutabla')

as X(SchemaName, Name)


BEGIN TRANSACTION TruncateTrans;

with foreignKeys AS (
     SELECT 
        SCHEMA_NAME(fk.schema_idas SchemaName
        ,fk.Name as ConstraintName
        ,OBJECT_NAME(fk.parent_object_idas TableName
        ,SCHEMA_NAME(t.SCHEMA_IDas ReferencedSchemaName
        ,OBJECT_NAME(fk.referenced_object_idas ReferencedTableName
        ,fc.constraint_column_id
        ,COL_NAME(fk.parent_object_idfc.parent_column_idAS ColumnName
        ,COL_NAME(fk.referenced_object_idfc.referenced_column_idas ReferencedColumnName
        ,fk.delete_referential_action_desc
        ,fk.update_referential_action_desc
    FROM sys.foreign_keys AS fk
        JOIN sys.foreign_key_columns AS fc
            ON fk.object_id = fc.constraint_object_id
        JOIN #tables tbl 
            ON OBJECT_NAME(fc.referenced_object_id= tbl.Name
        JOIN sys.tables t on OBJECT_NAME(t.object_id= tbl.Name 
            and SCHEMA_NAME(t.schema_id= tbl.SchemaName
            and t.OBJECT_ID = fc.referenced_object_id
)



select
    quotename(fk.ConstraintNameAS ConstraintName
    ,quotename(fk.SchemaName+ '.' + quotename(fk.TableNameAS TableName
    ,quotename(fk.ReferencedSchemaName+ '.' + quotename(fk.ReferencedTableNameAS ReferencedTableName
    ,replace(fk.delete_referential_action_desc'_'' 'AS DeleteAction
    ,replace(fk.update_referential_action_desc'_'' 'AS UpdateAction
    ,STUFF((
        SELECT ',' + quotename(fk2.ColumnName)
        FROM foreignKeys fk2 
        WHERE fk2.ConstraintName = fk.ConstraintName and fk2.SchemaName = fk.SchemaName
        ORDER BY fk2.constraint_column_id
        FOR XML PATH('')
    ),1,1,''AS ColumnNames
    ,STUFF((
        SELECT ',' + quotename(fk2.ReferencedColumnName)
        FROM foreignKeys fk2 
        WHERE fk2.ConstraintName = fk.ConstraintName and fk2.SchemaName = fk.SchemaName
        ORDER BY fk2.constraint_column_id
        FOR XML PATH('')
    ),1,1,''AS ReferencedColumnNames
into #FKs
from foreignKeys fk
GROUP BY fk.SchemaNamefk.ConstraintNamefk.TableNamefk.ReferencedSchemaNamefk.ReferencedTableNamefk.delete_referential_action_descfk.update_referential_action_desc



-- Drop FKs
select 
    identity(int,1,1as ID,
    'ALTER TABLE ' + fk.TableName + ' DROP CONSTRAINT ' + fk.ConstraintName AS script
into #scripts
from #FKs fk

-- Truncate 
insert into #scripts
select distinct 
    'TRUNCATE TABLE ' + quotename(tbl.SchemaName+ '.' + quotename(tbl.NameAS script
from #tables tbl

-- Recreate
insert into #scripts
select 
    'ALTER TABLE ' + fk.TableName + 
    ' WITH CHECK ADD CONSTRAINT ' + fk.ConstraintName + 
    ' FOREIGN KEY ('+ fk.ColumnNames +')' + 
    ' REFERENCES ' + fk.ReferencedTableName +' ('+ fk.ReferencedColumnNames +')' +
    ' ON DELETE ' + fk.DeleteAction COLLATE Latin1_General_CI_AS_KS_WS + ' ON UPDATE ' + fk.UpdateAction COLLATE Latin1_General_CI_AS_KS_WS AS script
from #FKs fk


DECLARE @script nvarchar(MAX);

DECLARE curScripts CURSOR FOR 
    select script
    from #scripts
    order by ID

OPEN curScripts

WHILE 1=1 BEGIN
    FETCH NEXT FROM curScripts INTO @script
    IF @@FETCH_STATUS != 0 BREAK;

    print @script;
    IF @Debug = 0
        EXEC (@script);
END
CLOSE curScripts
DEALLOCATE curScripts


drop table #scripts
drop table #FKs
drop table #tables


COMMIT TRANSACTION TruncateTrans;

domingo, 12 de junio de 2022

Como agregar estilo de boostrap a asp:DataGrid

 

<asp:GridView ID="GridView1" class="table table-bordered table-condensed table-responsive table-hover " runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Id" HeaderText="Id" />
        <asp:BoundField DataField="Name" HeaderText="Name" />
        </Columns>
</asp:GridView>