在我的程序中,我使用了4个存储过程,具体取决于在表单中选择的字段。
ctx = new DataClassesDataContext();
items = (from prjs in ctx.sp_Select_Stuknummers(prjnr) select prjs).ToList();
或
ctx = new DataClassesDataContext();
items = (from prjs in ctx.sp_Select_Stuknummers_Scanner(prjnr, scanner) select prjs).ToList();
依旧......
我使用LINQ to SQL,对于这4个查询中的每一个,我都有不同的结果类:
sp_Select_StuknummersResult
sp_Select_Stuknummers_ScannerResult
sp_Select_Stuknummers_Scanner_WPSResult
sp_Select_Stuknummers_StuknummerResult
它们都有相同的字段和定义。
现在,当我迭代结果时:
foreach (sp_Select_StuknummersResult x in items)
{
WPSitems ding = new WPSitems();
ding.ID = x.ID;
ding.Naam = x.Naam;
......
}
我需要传递要使用的类型(在此示例中:sp_Select_StuknummersResult)
有没有办法 A.轻松转换为新类型,以便每次都可以使用 要么 B.在foreach循环中动态设置类型?
也许甚至有一个我不知道的C ...... 任何帮助都非常感谢!
答案 0 :(得分:1)
默认情况下,L2S会为每个单独的存储过程自动生成单独的类型。但是,您可以在Linq-2-Sql Designer中轻松更改该返回类型。
在设计器中,单击存储过程。在“属性”窗口中,有一个条目'返回类型':从'自动生成的类型'更改它到你想要的类型。
如果存储过程从已映射的表中返回行,请在下拉列表中选择该类型。如果没有,您可以手动将类添加到设计器并配置要从存储过程返回的类型。
答案 1 :(得分:0)
如果我理解你的问题,这可能会帮助你:
1。)为结果类创建一个接口(例如)I_SP
:
sp_Select_StuknummersResult
sp_Select_Stuknummers_ScannerResult
sp_Select_Stuknummers_Scanner_WPSResult
sp_Select_Stuknummers_StuknummerResult
2.)确保items
为List<I_SP>
3.。)为foreach
循环
public void MyMethod<T>(List<I_SP> items) where T:I_SP {
foreach (var x in items.OfType<T>)
{
WPSitems ding = new WPSitems();
ding.ID = x.ID;
ding.Naam = x.Naam;
......
}
}
4。)然后就这样打电话:
MyMethod<*sp_Select_StuknummersResult result class*>(items);
希望它足够清楚。
答案 2 :(得分:0)
您可以使用泛型/反射来完成此操作。
public static WPSitems MapObjectWithIdenticalProperties<T>(T itemOfUnknownType) where T : new()
{
var inputType = typeof(T);
var outputType = typeof(WPSitems);
var outputItem = new WPSitems();
foreach (var inputProperty in inputType.GetProperties())
{
var matchingOutputProperty = outputType.GetProperties().FirstOrDefault(x => x.Name == inputProperty.Name);
if(matchingOutputProperty != null)
matchingOutputProperty.SetValue(outputItem, inputProperty.GetValue(itemOfUnknownType));
}
return outputItem;
}
上面的函数可以像这样调用:
var items = GetYourDataThatCanBeDifferentTypes();
var mappedItems = new List<WPSitems>();
foreach(var item in items)
mappedItems.add(MapObjectWithIdenticalProperties(item));