我正在写一个简单的电影数据库,它有三层服务层,数据访问层和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;
}
答案 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时,将类型的一个实例复制到另一个是标准做法。它可能看起来更多,但它是纯粹的基于内存的映射,并在您的业务层和客户之间提供了一层隔离。没有它,客户将受到业务层重构的影响