Unable to run query on orm lite with custom select

hi. I have an issue when running such SqlExpression and I am nut sure what is the reason

var q = Db.From<PozycjeBudzProj>()
    .LeftJoin<KwotyBudzProj>((k, a) => k.Id == a.PozycjaBudzProj)
    .LeftJoin<OpisAnalityczny>((k, a) => k.Id == a.PozycjaBudzProj)
    .GroupBy<PozycjeBudzProj>(tz => new { tz.Id, tz.BudzetProjektu, tz.Nazwa, tz.Symbol, tz.Nadrzedna, tz.RodzajPozycjiBudzetu })
    .Select<PozycjeBudzProj, OpisAnalityczny, KwotyBudzProj>((t0,t1,t2) => new EnovaBudgetItem
    {
        BudzetProjektu = t0.BudzetProjektu,
        Id = t0.Id,
        Nadrzedna = t0.Nadrzedna,
        Nazwa = t0.Nazwa,
        RodzajPozycjiBudzetu = t0.RodzajPozycjiBudzetu,
        Symbol = t0.Symbol,
        OpisAnalityczny = Sql.Sum(t1.KwotaValue),
        KwotyBudz = Sql.Sum(t2.KwotaValue)
    });
`System.InvalidOperationException: 'variable 't0' of type 'TendereoEnovaApi.ServiceModel.PozycjeBudzProj' referenced from scope '', but it is not defined'`

Referenced classes are simple:

public class PozycjeBudzProj
    {
        public int Id { get; set; }
        public int BudzetProjektu { get; set; }
        public string Nazwa { get; set; }
        public string Symbol { get; set; }
        public int? Nadrzedna { get; set; }
        public int RodzajPozycjiBudzetu { get; set; }
    }
    public class KwotyBudzProj
    {
        public int PozycjaBudzProj { get; set; }
        public decimal KwotaValue { get; set; }
    }
    public class OpisAnalityczny
    {
        public int PozycjaBudzProj { get; set; }
        public decimal KwotaValue { get; set; }
    }

this works

var q = Db.From<PozycjeBudzProj>()
    .LeftJoin<KwotyBudzProj>((k, a) => k.Id == a.PozycjaBudzProj)
    .LeftJoin<OpisAnalityczny>((k, a) => k.Id == a.PozycjaBudzProj)
    .GroupBy<PozycjeBudzProj>(tz => new { tz.Id, tz.BudzetProjektu, tz.Nazwa, tz.Symbol, tz.Nadrzedna, tz.RodzajPozycjiBudzetu })
    .Select<PozycjeBudzProj, OpisAnalityczny, KwotyBudzProj>((t0, t1, t2) => new
    {
        BudzetProjektu = t0.BudzetProjektu,
        Id = t0.Id,
        Nadrzedna = t0.Nadrzedna,
        Nazwa = t0.Nazwa,
        RodzajPozycjiBudzetu = t0.RodzajPozycjiBudzetu,
        Symbol = t0.Symbol,
        OpisAnalityczny = Sql.Sum(t1.KwotaValue),
        KwotyBudz = Sql.Sum(t2.KwotaValue)
    });

return Db.Select<EnovaBudgetItem>(q);
1 Like

For future readers with the same error, the issue is that custom select expression needs to be an anonymous type which OrmLite analyzes to only select the fields in the custom expression, e.g:

var q = Db.From<Table1>()
    .Select<Table1,Table2>((t1, t2) => new { t1.Id, t2.Name });

You would instead use the type when mapping the results of a custom select expression into the target type that matches the returned resultset, e.g:

Db.Select<CombinedResult>(q);

Note some shorthand syntax available, you can select all fields in table 1 by including the entire object, also if the name of the column in the custom expression is the same as the table column, you don’t need to repeat the field name:

.Select<Table1,Table2>((t1, t2) => new { t1, t2.Name });

Equivalent to:

.Select<Table1,Table2>((t1, t2) => new { 
    Field1 = t1.Field1, 
    Field2 = t1.Field2, 
    //....
    Name = t2.Name,
});
1 Like