【问题标题】:How to make a return type for a result set in LINQ如何在 LINQ 中为结果集创建返回类型
【发布时间】:2009-03-04 01:47:19
【问题描述】:

我在确定 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 说返回类型是 (None),这可能是症结所在。但是我没有与结果集匹配的 DBML 对象。

SP 采用三个参数,并返回一个包含多行的三列(ID、名称、值)的结果集。我可以为此创建一个数据对象,并将其命名为 resultSet

当我为此编写函数调用时,我卡住了:

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

我的问题是:

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

【问题讨论】:

    标签: sql linq linq-to-sql stored-procedures


    【解决方案1】:

    如果它根本不了解您的 SP,那可能是 SET FMT_ONLY 问题...尝试从 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 了解更多信息。

    【讨论】:

    • 为了清楚起见,SP 是从应用程序调用的并且工作正常,我只是不知道将其结果返回到 POCO 的最佳方法。正如您提到的,我将研究生成的类型。上述方法的任何具体提示都会有所帮助。谢谢马克。
    • 我不确定我可以添加什么 - 要么重命名 WSDL 中的类型,要么创建自己的类型并使用上面的“选择”......如果你澄清了模棱两可的区域,我可以添加更多细节...
    • 马克,我发现了问题所在。我的存储过程使用的是动态 SQL,其中 SQL 是根据输入参数形成的,然后执行 SQL 字符串。这样的过程不会在 DBML 设计器中自动生成类型,所以就像你建议的那样,我必须编写自己的 ISingleResult
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多