我想通過存儲過程返回採用精緻小巧的數據通過存儲過程返回數據的列表,以短小精悍
我的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中的邏輯具有如果需要修復時可以直接部署的優勢 –