加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

linq-to-sql – 具有多个结果的Linq到SQL存储过程

发布时间:2020-12-12 16:10:07 所属栏目:MsSql教程 来源:网络整理
导读:我们已经遵循下面的方法,使用LINQ To SQL从多个结果中获取数据 CREATE PROCEDURE dbo.GetPostByID( @PostID int)AS SELECT * FROM Posts AS p WHERE p.PostID = @PostID SELECT c.* FROM Categories AS c JOIN PostCategories AS pc ON (pc.CategoryID = c.Ca
我们已经遵循下面的方法,使用LINQ To SQL从多个结果中获取数据
CREATE PROCEDURE dbo.GetPostByID
(
    @PostID int
)
AS
    SELECT    *
    FROM      Posts AS p
    WHERE     p.PostID = @PostID

    SELECT    c.*
    FROM      Categories AS c
    JOIN      PostCategories AS pc
    ON        (pc.CategoryID = c.CategoryID)
    WHERE     pc.PostID = @PostID

从DataContext继承的类中的调用方法应如下所示:

[Database(Name = "Blog")]
public class BlogContext : DataContext
{
    ... 

    [Function(Name = "dbo.GetPostByID")]
    [ResultType(typeof(Post))]
    [ResultType(typeof(Category))]
    public IMultipleResults GetPostByID(int postID)
    {
        IExecuteResult result = 
            this.ExecuteMethodCall(this,((MethodInfo)(MethodInfo.GetCurrentMethod())),postID);

        return (IMultipleResults)(result.ReturnValue);
    }
}

请注意,该方法不仅使用映射到存储过程名称的Function属性进行装饰,还可以使用返回类型属性与存储过程返回的结果集的类型进行装饰.此外,该方法返回一个非类型化的接口IMultipleResults:

public interface IMultipleResults : IFunctionResult,IDisposable
{
    IEnumerable<TElement> GetResult<TElement>();
}

所以程序可以使用这个界面来检索结果:

BlogContext ctx = new BlogContext(...);

IMultipleResults results = ctx.GetPostByID(...);

IEnumerable<Post> posts = results.GetResult<Post>();

IEnumerable<Category> categories = results.GetResult<Category>();

在上述存储过程中,我们有两个选择查询
1.选择查询而不加入
2.使用Join选择查询

但是在上述第二选择查询中,显示的数据是来自表之一,即来自类别表.但是,我们已经使用join,并希望显示数据表,其中包含两个表的结果,即Categories和PostCategories.

>如果有人可以让我知道如何使用LINQ to SQL来实现这一点
>如果我们使用上述方法相对于使用简单的SQL来实现上述方法,那么性能取舍是什么

解决方法

Scott Guthrie(在MS上运行.Net开发团队的人)涵盖了几个月前在他的博客上做的这件事比以前更好,link here.在该页面上有一节题为“处理SPROC的多个结果形状” .这解释了如何处理来自不同形状(或相同形状)的存储过程的多个结果.

我强烈建议您订阅他的RSS Feed.他几乎是所有东西的权威来源.Net.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读