【问题标题】:LINQ to SQL Datacontext mapping to WCF DataContractLINQ to SQL Datacontext 映射到 WCF DataContract
【发布时间】:2012-02-15 22:53:13
【问题描述】:

我正在编写一个简单的电影数据库,它具有三层堆栈的服务层、数据访问层和 SQL DB。

我正在使用 LINQ to SQL 访问数据库并从数据库中的 Film 表中返回一个 Film。然后,这将作为 Film 对象从服务层中的 DataContracts 中返回。

我认为这可以正常工作,但它导致了一些看起来不正确的笨拙代码。请问有人可以检查一下吗?

将每个 LINQ 结果映射到它的 DataContract 是否是最佳实践?

public static class DBConnection
{
    private static RMDB_LINQDataContext _db;

    static DBConnection()
    {
        _db = new RMDB_LINQDataContext();
    }


    public static RMDB.DTO.Film GetFilm(string name)
    {
        var LINQ_film = from film in _db.GetTable<Film>()
                        where film.name == name
                        select film;

        if (LINQ_film.ToList().Count != 1)
        {
            // TODO - faultException
        }
        else
        {
            foreach (Film f in LINQ_film.ToList())
            {
                // Yuck
                return new RMDB.DTO.Film(f.name, 
                    f.releaseDate.GetValueOrDefault(), "foo", f.rating.GetValueOrDefault());
            }
        }

        return null;
    }

【问题讨论】:

    标签: wcf linq-to-sql


    【解决方案1】:

    当您的公式执行两次查询时,这会更加简洁和高效

        public static List<Film> GetFilm(string name)
        {
            var LINQ_film = from film in _db.GetTable<Film>()
                            where film.name == name
                            select new Film(film.name,
                                            film.releaseDate.GetValueOrDefault(), 
                                            "foo", 
                                            film.rating.GetValueOrDefault());
    
            var list = LINQ_film.ToList();
            if (list.Count != 1)
            {
                // TODO - faultException
            }
    
            return list;
        }
    

    从域对象映射到 DTO 时,将一个类型的实例复制到另一个实例是标准做法。它可能看起来需要更多的工作,但它是一个纯粹基于内存的映射,并在您的业务层和您的客户端之间提供了一层隔离。没有它,客户将受到业务层重构的影响

    【讨论】:

    • 假设 Film(来自 DB)与 RMDB.DTO.Film 不同,如果可以将一个类的每个实例复制到另一个类的实例。我会说,是的,没关系。
    • 所以你最终会为每个查询编写一个 POCO?
    • 我最终为每个发送的不同消息编写了一个 DataContract。一些操作采用相同的结构化消息
    • @AkpoaA,正如我理解您的问题,您将从数据库中检索 Film 对象并将它们(通过 WCF 服务猜测)作为另一个类 Film 的实例返回标记为 DataContract。那么就没有办法避免复制电影对象的数据。
    • 好的,谢谢两位,我在想我错过了什么,有一种更简洁的方法不必将 db 数据复制到 Wcf 数据合约
    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 2023-03-14
    • 1970-01-01
    • 2011-11-12
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多