15 multiple-resultsets linq-to-sql
我们遵循以下方法使用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
Run Code Online (Sandbox Code Playgroud)
继承自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);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,该方法不仅使用映射到存储过程名称的Function属性进行修饰,而且还使用带有存储过程返回的结果集类型的ReturnType属性进行修饰.此外,该方法返回IMultipleResults的无类型接口:
public interface IMultipleResults : IFunctionResult, IDisposable
{
IEnumerable<TElement> GetResult<TElement>();
}
Run Code Online (Sandbox Code Playgroud)
所以程序可以使用这个接口来检索结果:
BlogContext ctx = new BlogContext(...);
IMultipleResults results = ctx.GetPostByID(...);
IEnumerable<Post> posts = results.GetResult<Post>();
IEnumerable<Category> categories = results.GetResult<Category>();
Run Code Online (Sandbox Code Playgroud)
在上面的存储过程中,我们有两个选择查询1.选择不带连接的查询2.选择带有Join的查询
但是在上面的第二个选择查询中,显示的数据来自表中的一个,即来自Categories表.但是我们使用了join并希望显示数据表以及来自两个表的结果,即来自Categories和PostCategories.
Heya dude - 这有用吗?
IEnumerable<Post> posts;
IEnumerable<Category> categories;
using (BlogContext ctx = new BlogContext(...))
{
ctx.DeferredLoadingEnabled = false; // THIS IS IMPORTANT.
IMultipleResults results = ctx.GetPostByID(...);
posts = results.GetResult<Post>().ToList();
categories = results.GetResult<Category>().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();
}
}
Run Code Online (Sandbox Code Playgroud)
好.让我们打破这个.
首先,在使用块内部建立一个很好的连接(所以它处理得很好).
接下来,我们确保DEFERRED LOADING已关闭.否则,当你尝试做集合(例如post.Category == blah)时,它会看到它是空的,懒惰加载数据(例如,做数据库的rountrip)设置数据,然后THEN覆盖刚刚从数据库中拖出的数据,结果有Where(..)方法.唷!摘要:确保查询范围的延迟加载已关闭.
最后,对于每个帖子,迭代并设置第二个列表中的类别.
这有帮助吗?
修复它,以便它不会通过调用ToList()方法抛出枚举错误.
| 归档时间: |
|
| 查看次数: |
17804 次 |
| 最近记录: |