代码之家  ›  专栏  ›  技术社区  ›  Ash Machine

如何在Linq中为结果集生成返回类型

  •  2
  • Ash Machine  · 技术社区  · 16 年前

    我有一个问题要确定C和Linq如何解决处理不必返回表结构而是返回结果集的数据结构的常见问题。

    我有一个可以工作的存储过程,并将它包含在我的DBML中

    [Function(Name="dbo.p_GetObject")]
    public int p_GetObject([Parameter(Name="ObjectType", DbType="NVarChar(200)")] string objectType, [Parameter(Name="ItemState", DbType="Bit")] System.Nullable<bool> itemState, [Parameter(Name="IsPublished", DbType="Bit")] System.Nullable<bool> isPublished)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), objectType, itemState, isPublished);
        return ((int)(result.ReturnValue));
    }
    

    DBML说返回类型是(无),这可能是关键问题。但是,我没有与结果集匹配的DBML对象。

    sp接受三个参数,并返回一个结果集,其中有三列(id、name、value)和多行。我可以为此创建一个数据对象,并将其称为resultset

    当我为此编写函数调用时,我会陷入困境:

    public List<resultset> GetObject(string objectType, bool itemState, bool isPublished)
    {
        MyDataContext.p_GetObject(objectType, itemState, isPublished);
    }
    

    我的问题是:

    如何让对存储过程的数据上下文调用填充我的结果集对象?有更好的方法吗?返回类型应该是什么?SQL视图?正在寻找好的建议…

    1 回复  |  直到 16 年前
        1
  •  6
  •   Community CDub    8 年前

    如果只是不理解您的SP,这可能是设置fmt唯一的问题…尝试从简化版的SP生成数据?

    通常,不与现有实体映射1:1的SP/UDF将在生成的类型中公开自己。您可以在DBML文件中重命名它(不在设计器中),但我个人不会这样做;我倾向于将SP标记为私有,并将自己的方法写入自己的poco类型(为存储库定义):

    var typed = from row in cxt.SomeFunction(123)
                select new MyType {Id = row.Id, Name = row.Name, ...}
    

    这一点的原因部分是因为存储库的纯粹性,部分是为了防止设计者习惯于以意想不到的方式重新编写DBML;-p请参见 here 更多。