【发布时间】:2019-10-03 21:46:06
【问题描述】:
我有一些我希望能够重用的代码。为此,我需要动态传递 DbSet 类型。我该如何让它发挥作用?
public virtual DbSet<Runlist> Runlists { get; set; }
public void Method(Type myType)
{
using (var ctx = new FpContext())
{
Type myVariableType = myType;
var table = "myTable";
var sql = ctx.Database
.SqlQuery<myVariableType>("SELECT * FROM @table WHERE (UserId = @userid)"
, new SqlParameter("@userid", user.Id)
, new SqlParameter("@table", table)).ToList();
}
foreach (var r in sql)
{
foreach (XElement e in xmlDoc.Descendants(ns + "RateRequest"))
{
var originCode = e.Element(ns + "RequestedShipment").Element(ns + "Shipper").Element(ns + "Address").Element(ns + "PostalCode");
var postalCode = e.Element(ns + "RequestedShipment").Element(ns + "Recipient").Element(ns + "Address").Element(ns + "PostalCode");
var shipTime = e.Element(ns + "RequestedShipment").Element(ns + "ShipTimestamp");
var serviceType = e.Element(ns + "RequestedShipment").Element(ns + "ServiceType");
var totalWeight = e.Element(ns + "RequestedShipment").Element(ns + "TotalWeight").Element(ns + "Value");
var packageCount = e.Element(ns + "RequestedShipment").Element(ns + "PackageCount");
var weight = e.Element(ns + "RequestedShipment").Element(ns + "RequestedPackageLineItems").Element(ns + "Weight").Element(ns + "Value");
originCode.SetValue(origin);
postalCode.SetValue(r.Zipcode);
shipTime.SetValue(dt);
serviceType.SetValue("FEDEX_GROUND");
totalWeight.SetValue(r.TotalWeight);
packageCount.SetValue(r.BoxCount);
weight.SetValue(r.Weight);
}
xmlDoc.Save(HttpContext.Current.Server.MapPath("~/Requests/SoapRequest_v24.xml"));
}
}
我已经发布了额外的代码来尝试更多地解释我想要完成的事情。
【问题讨论】:
-
你可以使用反射,但一般来说泛型不适用于运行时类型
-
查看documentation of SqlQuery,使用适当的重载。
-
在下面的 cmets 上,您说:“关于如何实现这一点并访问 Dbset 的列名有什么建议吗?”你想要一个通用的查询构建器,你可以在其中编写如下内容:
RunList.Get(x => x.Name, x.Time, x.Location).ToList<T2>();?
标签: c# sql-server ado.net