当前位置:  开发笔记 > 编程语言 > 正文

具有多个结果的Linq到SQL存储过程

如何解决《具有多个结果的Linq到SQL存储过程》经验,为你挑选了2个好方法。

我们遵循以下方法使用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属性进行修饰,而且还使用带有存储过程返回的结果集类型的ReturnType属性进行修饰.此外,该方法返回IMultipleResults的无类型接口:

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

所以程序可以使用这个接口来检索结果:

BlogContext ctx = new BlogContext(...);

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

IEnumerable posts = results.GetResult();

IEnumerable categories = results.GetResult();

在上面的存储过程中,我们有两个选择查询1.选择不带连接的查询2.选择带有Join的查询

但是在上面的第二个选择查询中,显示的数据来自表中的一个,即来自Categories表.但是我们使用了join并希望显示数据表以及来自两个表的结果,即来自Categories和PostCategories.

    如果有人可以让我知道如何使用LINQ to SQL实现这一点

    如果我们使用上述方法来实现上述方法和简单的SQL,那么性能权衡是什么

Jason Jackso.. 9

斯科特格思里(曾经是MS的.Net开发团队的人)在几个月前在他的博客上介绍了如何做到这一点,这比以往任何时候都要好得多,链接在这里.在该页面上有一个标题为"处理来自SPROC的多个结果形状"的部分.这解释了如何处理来自不同形状(或相同形状)的存储过程的多个结果.

我强烈建议订阅他的RSS feed.他是相当多 .NET的所有的东西权威来源.



1> Jason Jackso..:

斯科特格思里(曾经是MS的.Net开发团队的人)在几个月前在他的博客上介绍了如何做到这一点,这比以往任何时候都要好得多,链接在这里.在该页面上有一个标题为"处理来自SPROC的多个结果形状"的部分.这解释了如何处理来自不同形状(或相同形状)的存储过程的多个结果.

我强烈建议订阅他的RSS feed.他是相当多 .NET的所有的东西权威来源.



2> Pure.Krome..:

Heya dude - 这有用吗?

IEnumerable posts;
IEnumerable categories;

using (BlogContext ctx = new BlogContext(...))
{
    ctx.DeferredLoadingEnabled = false; // THIS IS IMPORTANT.
    IMultipleResults results = ctx.GetPostByID(...);
    posts = results.GetResult().ToList();
    categories = results.GetResult().ToList();
}
// Now we need to associate each category to the post.
// ASSUMPTION: Each post has only one category (1-1 mapping).
if (posts != null)
{
    foreach(var post in posts)
    {
        int postId = post.PostId;
        post.Category = categories
            .Where(p => p.PostId == postId)
            .SingleOrDefault();
    }
}

好.让我们打破这个.

首先,在使用块内部建立一个很好的连接(所以它处理得很好).

接下来,我们确保DEFERRED LOADING关闭.否则,当你尝试做集合(例如post.Category == blah)时,它会看到它是空的,懒惰加载数据(例如,做数据库的rountrip)设置数据,然后THEN覆盖刚刚从数据库中拖出的数据,结果有Where(..)方法.唷!摘要:确保查询范围的延迟加载已关闭.

最后,对于每个帖子,迭代并设置第二个列表中的类别.

这有帮助吗?

编辑

修复它,以便它不会通过调用ToList()方法抛出枚举错误.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有