我怎样才能将这两种方法重构为1?

时间:2009-03-28 00:54:00

标签: c# asp.net entity-framework .net-3.5 refactoring

我正在尝试重构一些Entity Framework代码,其中我有Product实体和产品系列,系列,品牌等的相关实体。系列,系列和品牌实体都具有相同的基本结构,带有Id和文字属性。

以下两种方法非常相似,应该可以重构为单个方法,但我不确定如何动态传递我正在查询的实体。在这种情况下,我需要能够传入db.ProductFamilies或db.ProductSeriesSet。任何想法如何使这2成为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);
        }
    }

2 个答案:

答案 0 :(得分:5)

您可以使用Func<T, TResult>将好的实体集合的选择委派给调用者:

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

此处,XXX的类型为db.ProductFamiliesdb.ProductSeriesSet

然后您可以这样称呼它:

Get(42, db => db.ProductFamilies);
Get(12, db => db.ProductSeriesSet);

有效吗?

答案 1 :(得分:2)

如果db.ProductFamilies和db.ProductSeriesSet继承自相同的基类,那么当您使用ProductCollectionEFToProductCollectionDTO( BaseClass obj,bool值)时;

或者考虑通用类型

这是两种基本方法。