我有一个有趣的问题要解决,这可以通过将LINQ to SQL创建的对象成功地转换为我可以传递的单个主对象来帮助解决。这是高级别的情景。
我有许多存储过程来获取数据然后都返回完全相同的列。进入procs和逻辑的参数变化很大,因此单个proc不起作用。然后Linq创建一个强类型对象,在整个应用程序中用作参数和返回值。
我正在使用如上所述的这些强类型对象作为参数,并在用于分析股票的一系列过滤器中返回值。我的客户想要更改过滤器顺序的顺序。问题是每个后续过滤器仅适用于通过最后一个过滤器的内容。
目前我正在对我的参数进行硬编码,如果我可以创建一个可以将任何Linq对象投射到的主对象,那么我可以随时传递并返回主对象。
我已经阅读了互联网上有关在不同类型之间进行转换的材料,例如静态到匿名类型或整数列表以及包含表示整数的对象的数组列表,但我需要实际将一个对象转换为另一个对象。
我将采取什么样的方向来解决将linq生成的强类型对象转换为完全相同的单个主对象的问题?
感谢您的任何想法。
答案 0 :(得分:1)
如果所有linq对象具有相同的字段,则可以让它们实现使用这些公共字段定义的接口。然后,对过滤器方法的调用可能依赖于接口而不是特定的实现。换句话说,filter方法中的参数将是接口类型而不是linq类类型。
例如:其中ICommonFields是您使用每个l2s类中的所有公共字段定义的接口 -
public class Filterer
{
public ICommonFields filterStuff(ICommonFields x)
{
//do stuff
}
}
或 -
public class Filterer
{
public T filterStuff<T>(T x)
where T: class, ICommonFields, new()
{
//do stuff
}
}
我更喜欢通用版本,因为T成为实际类型而不是通过接口的引用 - 当通过具有查询表达式的接口使用类型时,linq-to-sql存在问题。
编辑:对不起,我第一次写这个回复时已经很晚了(可能是借口!:)。用示例代码修复了我明显的错误:)
答案 1 :(得分:0)
虽然可能有一种方法可以通过强制转换来实现这一点,但我将为您提供一个快速而肮脏的解决方案 - 而且我假设您的结果对象是基于集合的:
鉴于你所有的孩子对象 所有人共享相同的列,继续 并选择其中一个充当你的 主对象 - 然后简单地迭代 通过你的其他LINQ的行 对象并将它们添加到集合中 您的主对象。如果你的 结果对象是强类型的 数据表,然后你要做的就是添加 到.Rows集合。
此外,您可能只需将检索到的某些后续LINQ查询的元素直接添加到主对象,具体取决于您在LINQ中编写SELECT原因的方式。