通过存储过程返回数据列表给dapper我正在尝试使用Dapper通过存储过程返回数据我的DTO类类似于下面(为了简洁删除了一些)属性)publicclassCarDTO{publicintCarID{get;放;}公共字符串制造商{得到;放;}publicListCarOptions{get;放;所以基本上在数据库中我有一个CarOption表,它有一个CarID列——也就是说,Car可以有很多选项。我的分钟DAL层调用如下:privatestringgetCarDataSp="[dbo].[GetCarData]";publicIEnumerableGetCarData(intcustomerId,intyear){returnGet(db=>db.Query(getCarDataSp,new{CustomerID=customerId,Year=year},commandType:CommandType.StoredProcedure));我的Get函数的实现在我的BaseRepository类中:是否有可能使用Dapper我可以从我的存储过程中返回CarOptions?我当时的存储过程如下:ALTERPROCEDURE[dbo].[GetCarData]@CustomerIDint,@YearintASBEGINSETNOCOUNTON;SELECT*from[dbo].CarcJOIN[dbo].CustomercustONc.CarID=cust.CarIDWHEREcust.CustID=@CustomerIDANDcust.Year=@YearEND上面的查询可能会返回很多行以及CarID和Manufacturer以及我为简洁起见删除的其他属性。Dapper按预期将这些映射回DTO。但是它是如何在存储过程中返回CarOptions列表的-是否有另一个可以使用的查询或者应该以某种方式将其分开?例如,如果我返回了CarID1和CarID2,CarOption表中可能有6行CarID1和CarID1表中的4行CarID2,理想情况下我希望它们都返回到CarOptions集合如果可能通过Dapper?对的,这是可能的。有几种方法可以用巧妙的方法解决“一对多”情况:方法1–返回两个查询,在DAL中组合ALTERPROCEDURE[dbo].[GetCarData]@CustomerIDint,@YearintASBEGINONSETNOCOUNT;--returncarsSELECTc.*from[dbo].CarcINNERJOIN[dbo].CustomercustONc.CarID=cust.CarIDWHEREcust.CustID=@CustomerIDANDcust.Year=@Year--返回选项选择opt.*来自[dbo].CarcINNERJOIN[dbo].CustomercustONc.CarID=cust.CarIDINNERJOINdbo.CarOptionsoptONop.CarID=c.CarIDWHEREcust.CustID=@CustomerIDANDcust.Year=@YearENDDALvarmulti=db.QueryMultiple(getCarDataSp,new{CustomerID=customerId,Year=year},commandType:CommandType.StoredProcedure));varcars=multi.Read();varoptions=multi.Read();//将选项连接到汽车foreach(varcarincars){varcarOptions=options.Where(w=>w.Car.CarID==car.CarID);//我一般会覆盖Equals,这样你就可以写w.Car.Equals(car)...在通用DataModel类car.Options=carOptions.ToList()上执行此操作;}方法2-返回查询,拆分在DALPROCALTERPROCEDURE[dbo].[GetCarData]@CustomerIDint,@YearintASBEGINSETNOCOUNTON;从[dbo]选择c.*,选择*。CarcINNERJOIN[dbo].CustomercustONc.CarID=cust.CarIDLEFTOUTERJOINdbo.CarOptionsoptONop.CarID=c.CarIDWHEREcust.CustID=@CustomerIDANDcust.Year=@YearENDDALvartuples=db.Query>(getCarDataSp,new{CustomerID=customerId,Year=year},(car,opt)=>Tuple.Create(car,opt),commandType:CommandType.StoredProcedure);//按汽车对元组进行分组varcars=tuple.GroupBy(gb=>gb.Item1.CarID)//同样,重写equals使它成为GroupBy(gb=>gb.Item1).Select(s=>{varcar=s.First().Item1;varcarOptions=s.Select(t=>t.Item2).ToList()returncar;});在查询中使用临时表的增强这会将所有按参数过滤的内容放入单个查询中,以便后续查询是ID的简单选择。改变程序[dbo].[GetCarData]@CustomerIDint,@YearintASBEGINSETNOCOUNTON;声明@t表(CarIDint);--filtercars(这里只处理参数)INSERTINTO@t(CarID)SELECTc.CarIDFROMdbo.CarcINNERJOIN[dbo].CustomercustONc.CarID=cust.CarIDWHEREcust.CustID=@CustomerIDANDcust.Year=@Year--returncarsSELECTc.*FROM[dbo].CarcINNERJOIN@ttONt.CarID=c.CarID--returnoptionsSELECTopt.*FROMdbo.CarOptionsoptINNERJOIN@ttONt.CarID=opt.CarIDEND应用BaseDTO以帮助实现平等一旦你有了BaseDTO,并连接了你的ID,你可以简单地说:cars.Where(w=>w.Equals(car)),dictionary[car]如果有,if(car.Equals)(otherCar))orresults.GroupBy(gb=>gb.Car)...以上就是C#学习教程:返回数据列表到全部内容dapper通过存储过程分享给大家,如果对大家有用,需要进一步了解C#希望大家多多关注教程——publicclassBaseDTO{internalintID{get;放;}//////如果obj是具有相同id的相同类型,我们将认为它是相等的。///publicoverrideboolEquals(objectobj){if(obj==null||this.GetType()!=obj.GetType()){返回假;}返回this.GetType().GetHashCode()==obj.GetType().GetHashCode()&&this.ID==(BaseDTO)obj.ID;}/////如果你重写equals,你应该重写gethashcode。///http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode#263416///publicoverrideintGetHashCode(){未选中{int散列=17;hash=hash*23+this.GetType().GetHashCode();hash=hash*23+this.ID;返回散列;}}}publicclassCarDTO:BaseDTO{publicintCarID{get{returnthis.ID;}设置{this.ID=value;}}publicstring制造商{get;放;}publicListCarOptions{get;放;}}本文来自网络收藏,不代表立场,如涉及侵权,请点击维权联系管理员删除,如需转载请注明出处:
