C# 如何将这两个方法重构为1?

C# 如何将这两个方法重构为1?,c#,asp.net,entity-framework,.net-3.5,refactoring,C#,Asp.net,Entity Framework,.net 3.5,Refactoring,我试图重构一些实体框架代码,其中我有一个产品实体和产品系列、系列、品牌等的相关实体。系列、系列和品牌实体都具有相同的基本结构,具有Id和文本属性 下面的两个方法非常相似,应该能够重构为一个方法,但我不确定如何动态地传递我查询的实体。在这种情况下,我需要能够传入db.ProductFamilies或db.ProductSeriesSet。有没有办法让这两个变为1 谢谢 public DTOs.ProductCollection GetFamily(int id) {

我试图重构一些实体框架代码,其中我有一个产品实体和产品系列、系列、品牌等的相关实体。系列、系列和品牌实体都具有相同的基本结构,具有Id和文本属性

下面的两个方法非常相似,应该能够重构为一个方法,但我不确定如何动态地传递我查询的实体。在这种情况下,我需要能够传入db.ProductFamilies或db.ProductSeriesSet。有没有办法让这两个变为1

谢谢

    public DTOs.ProductCollection GetFamily(int id)
    {
        using (Entities db = new Entities())
        {
            var fam = (from collection in db.ProductFamilies.Include("Product")
                        .Include("Product.Stuff1")
                        .Include("Product.Stuff2")
                       where collection.Id == id
                       select collection).FirstOrDefault();
            return ProductCollectionEFToProductCollectionDTO(fam, true);
        }
    }

    public DTOs.ProductCollection GetSeries(int id)
    {
        using (Entities db = new Entities())
        {
            var ser = (from collection in db.ProductSeriesSet.Include("Product")
                        .Include("Product.Stuff1")
                        .Include("Product.Stuff2")
                       where collection.Id == id
                       select collection).FirstOrDefault();
            return ProductCollectionEFToProductCollectionDTO(ser, true);
        }
    }

如果db.ProductFamilies和db.ProductSeriesSet是从同一基类继承的,那么当您使用ProductCollectionFToProductCollectionDTO(BaseClassobj,bool值)时

或者考虑泛型类型


这是两种基本方法。

您可以使用
Func
将良好实体集合的选择委托给调用者:

public DTOs.ProductCollection Get(int id, Func<Entities, XXX> selector)
{
    using (Entities db = new Entities())
    {
        var result = (from collection in selector(db).Include("Product")
                    .Include("Product.Stuff1")
                    .Include("Product.Stuff2")
                   where collection.Id == id
                   select collection).FirstOrDefault();
        return ProductCollectionEFToProductCollectionDTO(result, true);
    }
}

它有效吗?

如何处理from子句中发现的差异,在from子句中,您可以从ProductSerieSet或ProductFamilies查询。我没有注意到,是的,您的比我的好。几乎就在这里。我遇到的问题是ProductFamilies和ProductSerieSet(XXX)没有公共基类,因此我没有一个类型来替换XXX。我尝试做的是添加一个ProductCollection接口,它们都实现了这个接口。在下一篇评论中继续…通过使用公共接口,我可以实现该方法,但调用时必须执行以下GetProductCollection(id,db=>(ObjectQuery)db.ProductFamilies.Cast());继续…由于强制转换,我在运行时得到“LINQtoEntities仅支持强制转换实体数据模型基元类型”。我不知道如何获得一个通用的基类型来处理所有这些实体。每个实体从不同的表中提取其公共字段。如何处理实体?
Get(42, db => db.ProductFamilies);
Get(12, db => db.ProductSeriesSet);