LINQ to SQL Datacontext映射到WCF DataContract

时间:2012-01-21 22:23:14

标签: wcf linq-to-sql

我正在写一个简单的电影数据库,它有三层服务层,数据访问层和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;
    }

1 个答案:

答案 0 :(得分: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时,将类型的一个实例复制到另一个是标准做法。它可能看起来更多,但它是纯粹的基于内存的映射,并在您的业务层和客户之间提供了一层隔离。没有它,客户将受到业务层重构的影响