LinqToSql and abstract base classes

前端 未结 4 499
[愿得一人]
[愿得一人] 2021-01-18 11:59

I have some linq entities that inherit something like this:

public abstract class EntityBase { public int Identifier { get; } }

public interface IDeviceEnti         


        
4条回答
  •  忘掉有多难
    2021-01-18 12:22

    LINQ-to-SQL has some support for inheritance via a discriminator (here, here), but you can only query on classes that are defined in the LINQ model - i.e. data classes themselves, and (more perhaps importantly for this example) the query itself must be phrased in terms of data classes: although TEntity is a data class, it knows that the property here is declared on the entity base.

    One option might be dynamic expressions; it the classes themselves declared the property (i.e. lose the base class, but keep the interface) - but this isn't trivial.

    The Expression work would be something like below, noting that you might want to either pass in the string as an argument, or obtain the primary key via reflection (if it is attributed):

    static Expression> BuildWhere(int deviceId) {
        var id = Expression.Constant(deviceId, typeof(int));
        var arg = Expression.Parameter(typeof(T), "x");
        var prop = Expression.Property(arg, "DeviceId");
        return Expression.Lambda>(
            Expression.Equal(prop, id), arg);
    }
    

提交回复
热议问题