0

How can I use any table name for get any record from any table use Linq2db. I try use generic, but I don't understand how I have to set the current table.

public void ObjectGetById<T>(int id, ref T obj)
{
    string tbl = obj.GetType().Name;
    using (var db = new cwDB("city5"))
    {
        IQueryable<T> r = (from p in db.GetTable<>().TableName(tbl) select p);
        r = from p in r where p.ID == id select p;
        obj = (T)(object)r.FirstOrDefault();
    }
}
Svyatoslav Danyliv
  • 21,911
  • 3
  • 16
  • 32

1 Answers1

1

I have moved this function to static class.

public static class ObjectQueryHelper
{
    public static bool ObjectGetById<T>(this IDataContext dc, int id, [NotNullWhen(true)] out T? obj)
        where T : class
    {
        var ed = dc.MappingSchema.GetEntityDescriptor(typeof(T));

        // assume that we have only one PK Column
        var pk = ed.Columns.Single(c => c.IsPrimaryKey);

        var param = Expression.Parameter(typeof(T), "e");

        var memberExpr = Expression.MakeMemberAccess(param, pk.MemberInfo);
        var idExpr     = (Expression)Expression.Constant(id);

        if (idExpr.Type != memberExpr.Type)
            idExpr = Expression.Convert(idExpr, memberExpr.Type);

        // generating filter
        var filter       = Expression.Equal(memberExpr, idExpr);
        var filterLambda = Expression.Lambda<Func<T, bool>>(filter, param);

        obj = dc.GetTable<T>().FirstOrDefault(filterLambda);
        return obj != null;
    }
}
Svyatoslav Danyliv
  • 21,911
  • 3
  • 16
  • 32