我们遵循以下方法使用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 { IEnumerableGetResult (); }
所以程序可以使用这个接口来检索结果:
BlogContext ctx = new BlogContext(...); IMultipleResults results = ctx.GetPostByID(...); IEnumerableposts = 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的所有的东西权威来源.
斯科特格思里(曾经是MS的.Net开发团队的人)在几个月前在他的博客上介绍了如何做到这一点,这比以往任何时候都要好得多,链接在这里.在该页面上有一个标题为"处理来自SPROC的多个结果形状"的部分.这解释了如何处理来自不同形状(或相同形状)的存储过程的多个结果.
我强烈建议订阅他的RSS feed.他是相当多的 .NET的所有的东西权威来源.
Heya dude - 这有用吗?
IEnumerableposts; 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()
方法抛出枚举错误.