在foreach循环中选择类型

时间:2016-09-28 11:58:32

标签: c# linq-to-sql

在我的程序中,我使用了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 ...... 任何帮助都非常感谢!

3 个答案:

答案 0 :(得分:1)

默认情况下,L2S会为每个单独的存储过程自动生成单独的类型。但是,您可以在Linq-2-Sql Designer中轻松更改该返回类型。

在设计器中,单击存储过程。在“属性”窗口中,有一个条目'返回类型':从'自动生成的类型'更改它到你想要的类型。

如果存储过程从已映射的表中返回行,请在下拉列表中选择该类型。如果没有,您可以手动将类添加到设计器并配置要从存储过程返回的类型。

example

答案 1 :(得分:0)

如果我理解你的问题,这可能会帮助你:

1。)为结果类创建一个接口(例如)I_SP

sp_Select_StuknummersResult
sp_Select_Stuknummers_ScannerResult
sp_Select_Stuknummers_Scanner_WPSResult
sp_Select_Stuknummers_StuknummerResult
  • 将所需的常用变量和方法添加到该界面中。

2.)确保itemsList<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));