我想通过存储过程返回采用精致小巧的数据通过存储过程返回数据的列表,以短小精悍
我的DTO类是类似以下(除去简洁一些属性)
public class CarDTO
{
public int CarID { get; set; }
public string Manufacturer { get; set; }
public List<CarOptionDTO> CarOptions { get; set; }
}
所以基本上在数据库中我有一个CarOption表,它有一个CarID列 - 例如Car可以有很多选项。
在一分钟我的DAL层调用如下:
private string getCarDataSp = "[dbo].[GetCarData]";
public IEnumerable<CarDTO> GetCarData(int customerId, int year)
{
return Get(db => db.Query<CarDTO>(getCarDataSp , new { CustomerID = customerId, Year = year },
commandType: CommandType.StoredProcedure));
}
我获取功能的实现是在我BaseRepository类为:
public T Get<T>(Func<IDbConnection, T> query)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
return query.Invoke(db);
}
}
采用小巧玲珑的,我可以从返回是否有可能我的存储过程也是CarOptions?
我在一分钟存储的过程是如下:
ALTER PROCEDURE [dbo].[GetCarData]
@CustomerID int,
@Year int
AS
BEGIN
SET NOCOUNT ON;
SELECT * from [dbo].Car c
JOIN [dbo].Customer cust ON c.CarID = cust.CarID
WHERE cust.CustID = @CustomerID AND cust.Year = @Year
END
上述查询可以返回许多行和CarID和制造商和其他属性我为简洁移除。 Dapper会按预期将它们映射回DTO。
但是,它是如何返回存储过程中的CarOptions的列表 - 是否有可能与另一个查询或应该分离出来?例如,如果我返回CarID 1和CarID 2,CarOption表中可能有6行CarID 1和4行与CarID 2的CarOption表中,理想情况下,我希望将它们全部返回到CarOptions集合如果可能,通过Dapper?
很好,我会给这个去吧。从第一眼我就喜欢选项2 ...尽量保持代码中的逻辑并保持存储过程'更清洁' –
选项2的缺点是查询大小会更加丰富...如果汽车有50个选项该列数据重复50次(每个选项一次)。不是一个大问题,但无论如何。 – BlackjacketMack
好点。它可能有多达70个选项......不大可能有10个以上的选项,但可能有多达70个。除了有一点选项1之外,你可以看到有什么缺点。除SP之外还有很多逻辑。我猜想SP中的逻辑具有如果需要修复时可以直接部署的优势 –