LINQ to SQL类到我自己的类

时间:2009-11-08 23:14:54

标签: linq linq-to-sql data-access-layer

我正在使用LINQ to SQL来处理我正在开发的新项目,但我不想将LINQ类公开给我的应用程序。例如,select in link返回System.Linq.IQueryable<>采集。同样,为表示数据库而生成的所有类都使用Table,Column,EntityRef类和属性。如果我的数据访问层具有LINQ依赖性,那很好,但我不希望我的应用程序。

所以我的想法是,我必须使用LINQ to SQL生成的类作为不在我的数据访问层之外公开的中间类,并创建我自己的应用程序可以使用的类。将LINQ to SQL类中的数据放入我自己的类中最简单/最有效的方法是什么?

5 个答案:

答案 0 :(得分:1)

Rob Conery发布了一个名为MVC-Storefront的网络广播系列,在那里他介绍了一种可以实现你想要的存储库模式的变体。

我在一个相当大的项目中使用了截屏视频中的想法,并对结果非常满意。

但是,模式存在问题,特别是在完全提交之前您需要预先考虑的并发和分离场景。

我用这种模式here详细说明了我的并发痛苦。

答案 1 :(得分:0)

从LINQ to SQL类转到类是一个相当直接的LINQ to Objects(或者只是对单个对象进行初始化)的问题。

更有趣的是从你的模型回到LINQ to SQL对象,但这是相当标准的东西(虽然我还在努力,或者我会找到一些特定的参考资料)。

答案 2 :(得分:0)

我会对你得到的回答感兴趣,因为我正在考虑完全相同的事情。我想在我们的后端使用L2S实体类,但是使用更轻量级的实体来进行应用程序消费。

兰迪

答案 3 :(得分:0)

这是我目前如何做到这一点:

我有一个DataContext类,我通过添加LINQ to SQL类并将表放到设计器上来创建。我调用了类MyDataContext并将其放在名为Linq的名称空间中。我的数据库有一个名为Tag的表,它在Linq命名空间中生成了一个类。我将所有访问器更改为内部访问器,因此它们在数据访问层之外不可见。

namespace Linq
{
    [System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDb")]
    internal partial class MyDataContext : System.Data.Linq.DataContext
    {
        ...
    }

    [Table(Name="dbo.vTag")]
    internal partial class Tag
    {
        ....
    }
}

然后我创建了一个名为DataAccess的类,它将向任何引用该程序集的应用程序公开。我还创建了自己的Tag类。 DataAccess类和我的新Tag类位于名为Data的不同名称空间中,以避免与Linq名称空间中生成的类发生冲突。我使用Linq to Sql来查询Linq.Tag对象的IList,然后我使用Linq从Linq.Tag对象生成一个Data.Tag对象列表。

我想听听有关这方面的评论,看看是否有更高性能的方法,或者需要更少的代码。我对使用重复的类名(Tag)也不太满意,所以我也有兴趣听到有关命名建议的任何想法。

namespace Data
{
    public class DataAaccess
    {
        public IList<Tag> List_Tags()
        {
            using (Linq.MyDataContext dal = new Linq.MyDataContext ())
            {                
                IList<Linq.Tag> lstTags =  (from c in dal.Tags select c).ToList();

                return (from tag in lstTags
                        select new Data.Tag()
                            {
                                ID = tag.ID,
                                Name = tag.Name,
                                Parent_ID = tag.Parent_ID
                            }).ToList();
            }
        }
    }
}

答案 4 :(得分:0)

您提出的建议是拥有两个独立的模型。这意味着样板代码,我发现它是没有必要的。我或多或少和你有同样的想法,但意识到这将是无用的。我已经在这个帖子的另一个答案中提出了Entity Framework,我想在这里再说一遍。

你最终得到的是一个模型汤,你必须维护两个模型而不是一个模型。这绝对不可取。