Peta poco列缓存问题

时间:2014-09-18 18:32:18

标签: entity-framework petapoco expandoobject

我正在学习POCO,虽然我喜欢很多概念,但我认为我并没有得到它。

我遇到如下问题:

我有一个sproc,它会针对这些列返回多个列和值,这些列根据特定条件在sproc内部动态构建。

例如根据输入,下面的结果之一应该返回,

1)

  Id -- Name -- Age  
  1     Peter   25   
  2     Janit   53

2)

Id -- Provider Name -- Provider Type
5     C. A              hospital           

我无法为这些动态列创建类,因此我使用动态对象和POCO DB获取记录。

List<dynamic> list = db.fetch<dynamic>(sql);

当其他人用不同的参数调用该函数时会出现问题,然后结果保留POCO的第一次调用的列信息,并且得到欲望的结果。

  Id -- Name --    Age  
  5     C. A       hospital           

这种差异导致运行时错误。

你能帮我解决这个问题吗? 或者我如何为这种场景定义类?

希望我详细解释我的问题。

3 个答案:

答案 0 :(得分:0)

您可以定义POCO类以获取结果。我用了很多。 PetaPoco将仅填写SP返回的字段。

答案 1 :(得分:0)

创建一个POCO,其中包含您希望以下列方式从动态SP返回的所有列:

public class PocoName    
{
    public int Id {get; set;}
    public string Name {get; set;}
    public int Age  {get; set;}
    public string ProviderName  {get; set;}
    public string ProviderType  {get; set;}
    ...
}

然后按如下方式调用该函数:

List<PocoName> list = db.fetch<PocoName>(sql);

每次使用不同的输入参数运行sproc时,只会在您的POCO中填充由sproc返回的列。

答案 2 :(得分:0)

尽管这是3岁的帖子,但最近我遇到了类似的问题。希望该解决方法能对以后遇到此问题的人有所帮助。

  • PetaPoco保留对象定义的缓存。因此,当我们期望将diff动态对象列表作为结果时,任何将diff参数作为相同SP的db.fetch / db.query都将返回第一个调用的对象定义。我试图缓存突发,但找不到方法。也许有选项/配置,但我还没有尝试那么远。如果有人知道缓存突发的方法,请共享。
  • 由于要使定义的POCO类适合这种情况的动态性质是不切实际的(如作者前面提到的那样),我尝试返回DataTable,然后将其转换为按预期工作的动态对象列表。

谢谢