【问题标题】:How can I refactor these 2 methods into 1?如何将这两种方法重构为 1?
【发布时间】:2010-10-16 01:40:05
【问题描述】:

我正在尝试重构一些实体框架代码,其中我有一个产品实体和产品系列、系列、品牌等的相关实体。系列、系列和品牌实体都具有相同的基本结构,带有一个 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);
        }
    }

【问题讨论】:

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


    【解决方案1】:

    您可以使用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);
    

    有效吗?

    【讨论】:

    • 快到了。我遇到的问题是 ProductFamilies 和 ProductSeriesSet (XXX) 没有共同的基类,所以我没有替换 XXX 的类型。我尝试做的是添加他们都实现的 ProductCollection 接口。在下一条评论中继续...
    • 通过拥有通用接口,我可以实现该方法,但调用时必须执行以下 GetProductCollection(id, db => (ObjectQuery)db.ProductFamilies.Cast()) ;继续...
    • 由于强制转换,我在运行时得到“LINQ to Entities 仅支持强制转换实体数据模型原始类型”。我看不出如何获得一个通用的基本类型来处理所有这些实体。每个实体从不同的表中提取它们的公共字段。我一般如何处理实体?
    【解决方案2】:

    如果 db.ProductFamilies 和 db.ProductSeriesSet 继承自同一个基类,那么当你使用 ProductCollectionEFToProductCollectionDTO(BaseClass obj, bool value );

    或者考虑泛型类型

    这是两种基本方法。

    【讨论】:

    • 如何处理从 ProductSeriesSet 或 ProductFamilies 查询的 from 子句中发现的差异?
    • 我没有注意到,是的,你的比我的好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多