C# 如何在linq查询中使用反射?RSS

C# 如何在linq查询中使用反射?RSS,c#,entity-framework,linq,asp.net-core,entity-framework-core,C#,Entity Framework,Linq,Asp.net Core,Entity Framework Core,我正在寻找一种在linq查询中使用反射的方法,以提高代码的可重用性。例如,我想更改此方法: private Orders GetObjectGraph(MyDbContext dbContext, int orderID) { return dbContext.Orders.Include(o => o.OrderDetails).AsNoTracking().FirstOrDefault(o => o.OrderID == orderID); } 对这样的事情: priv

我正在寻找一种在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);
}
有人能帮我完成这项任务吗


提前感谢

您可以尝试类似的方法(如果您没有从运行时外部的某个地方获取字符串,如果您这样做,则此解决方案可以调整为从字符串生成相应的字符串):

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

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);
    }
}

关于如何处理字符串的更多细节,您可以看看这个。

我不想使用反射,但听起来像是通用方法的用例,可能内置了一些规范模式。请查看eShopOnWeb以了解实现您是否只有实体的字符串名称?因为如果您在调用时知道实体类型,您可以将
字符串
参数替换为
表达式
,并添加一个通用类型来标识根实体。感谢您的回复。但我认为你的样本中缺少了“masterEntityName”。你能提供更多关于发生了什么的描述吗?谢谢
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);