【问题标题】:How to use Reflection in linq queries ?RSS如何在 linq 查询中使用反射?RSS
【发布时间】:2020-05-31 20:37:32
【问题描述】:

我正在寻找一种在我的 linq 查询中使用反射来提高代码可重用性的方法。例如,我想改变这个方法:

private Orders GetObjectGraph(MyDbContext dbContext, int orderID)
{
    return dbContext.Orders.Include(o => o.OrderDetails).AsNoTracking().FirstOrDefault(o => o.OrderID == orderID);
}

到这样的事情:

private object GetObjectGraph(MyDbContext dbContext, string masterEntityName, string detailsEntityName, string masterFieldName, object masterFieldValue)
{
    return dbContext[masterEntityName].Include(o => o[detailsEntityName]).AsNoTracking().FirstOrDefault(o => o.[masterFieldName] == masterFieldValue);
}

谁能帮我完成这个任务?

提前致谢

【问题讨论】:

  • 我会远离反射,但听起来像是泛型方法的用例,可能内置了一些规范模式。查看 eShopOnWeb 以了解实现
  • 您只有实体的字符串名称吗?因为如果您在调用时知道实体类型,您可以将 string 参数替换为 Expressions 并添加一个泛型类型来标识根实体。

标签: c# entity-framework linq asp.net-core entity-framework-core


【解决方案1】:

您可以尝试这样的事情(如果您在运行时没有从外部某处获取字符串,如果您这样做了,那么此解决方案可以适应从字符串构建相应的Expression Trees):

private T GetObjectGraph<T, TDetails, TField>(
    MyDbContext dbContext,
    Expression<Func<T, TDetails>> details,
    Expression<Func<T, TField>> field,
    TField value) where T: class
{
    var p = field.Parameters[0];
    var eq = Expression.Equal(field.Body, Expression.Constant(value));
    var expr = Expression.Lambda<Func<T, bool>>(eq, p); 
    return dbContext
        .Set<T>()
        .Include(details)
        .AsNoTracking()
        .FirstOrDefault(expr);
}

及用法:

GetObjectGraph(dbContext, (Order o) => o.OrderDetails, o => o.OrderID, orderID)

如果您不需要解析字符串等,这可以简化为:

public static class Ext
{
    public static T GetObjectGraph<T, TDetails>(
        this DbSet<T> set, 
        Expression<Func<T, TDetails>> details,
        Expression<Func<T, bool>> filter) where T : class
    {

        return set
            .Include(details)
            .AsNoTracking()
            .FirstOrDefault(filter);
    }
}

及用法:

dbContext.Orders(o => o.OrderDetails, o => o.OrderID == orderID);

如需更多了解如何处理字符串,您可以查看question

【讨论】:

  • 感谢您的回复。但我认为您在示例中缺少“masterEntityName”。你能提供更多关于发生了什么的描述吗?谢谢
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多