1. Creazione Trigger (soluzione tampone)



Creo il mio trigger nella TGI_AggiornamentiPhsys_ConfermaLettura in modo che per ogni riga creata nella TGI_AggiornamentiPhsys, ci sia un utente "0" che non ha mai visualizzato, quindi con Data a NULL.

CREATE TRIGGER [dbo].[trg_Insert_ConfermaLettura]
ON [dbo].[TGI_AggiornamentiPhsys]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO TGI_AggiornamentiPhsys_ConfermaLettura (IDAggiornamento, UserId, DataConfermaLettura)
    SELECT ID, 0, NULL
    FROM inserted;
END;




2. Left Join nella mia Row principale



Ora lego il mio ID della mia row principale della tabella TGI_AggiornamentiPhsys a TGI_AggiornamentiPhsys_ConfermaLettura

 

 [DisplayName("Id"), Column("ID"), Identity, ForeignKey("[dbo].[TGI_AggiornamentiPhsys_ConfermaLettura]", "IDAggiornamento"), LeftJoin("conf")]
 public Int32? Id
 {
     get { return Fields.Id[this]; }
     set { Fields.Id[this] = value; }
 }

 

[DisplayName("Data Conferma Lettura"), Expression("conf.DataConfermaLettura")]
public DateTime? DataConfermaLettura
{
    get { return Fields.DataConfermaLettura[this]; }
    set { Fields.DataConfermaLettura[this] = value; }
}

 public class RowFields : RowFieldsBase
 {
        public Int32Field Id;
        public DateTimeField DataConfermaLettura;
 }




3. Filtro nella Join anche UserId (Repository)



Siccome facendo questo semplice LeftJoin con IDAggiornamento potrebbe avere piu' righe e a noi interessa vedere se ha "visualizzato" il messaggio per quel utente è necessario fare in questo modo nella propria Repository:

 

private class MyListHandler : ListRequestHandler<MyRow>
{

    protected override void ApplyFilters(SqlQuery query)
    {
        base.ApplyFilters(query);

        var userId = Authorization.UserId;

        query.Where(
        new Criteria("conf.UserId = " + userId + @"
            OR (
                conf.UserId = 0 AND NOT EXISTS (
                    SELECT 1 FROM TGI_AggiornamentiPhsys_ConfermaLettura A 
                    WHERE A.IDAggiornamento = conf.IDAggiornamento 
                      AND A.UserId = " + userId + @"))")
        );
    }
}




Spiegazione finale



Durante la query del ApplyFilters mi prendo le righe che hanno UserId legato con la join, ma se lo faccio non mi mostrerà nella mia Row tutte le righe poichè non è detto che esistono ancora, quindi avendo creato delle righe con UserId a 0, necessarie per farlo funzionare, verifico se non esistono righe con UserId e con IDAggiornamento pari al UserId loggato, se esiste allora prendo quel valore altrimenti prendo quello che ha UserId come 0.

Lascio lo screen per mostrare come viene visualizzato in Serenity e quello che c'è in tabella.