为什么我的Linq语句会被执行两次?

4

我正在开发一个内部消息系统。我已经连接了mvc mini profiler,并且它向我展示了一些语句被执行了两次,但我无法弄清楚原因。

我的控制器非常简单:

var db = MessagingDataContext.Get();
return db.Posts.OrderByDescending(p => p.DatePosted).Skip(pagenumber * pagesize).Take(pagesize);

我的看法也很简单(我的_Layout页面有其余的标记):

@foreach (var post in Model)
{
    <div class="post">
        <p>
            @Html.ActionLink(post.Title, "View", "Posts", new { postid = post.Id})  by @post.User.Name
        </p>
    </div>
}

那么为什么会执行两次 get_User 函数呢?

不,那是查询语句。我的Post对象有一个UserId外键。我通过@post.User.Name获取用户信息。 - user60456
你好奇数据库中有多少篇文章?是2篇吗? - Phil
Joe:您发布的LINQ查询仅反映了您发布的3个SQL查询中的第一个。 您没有发布另外两个相同的SQL查询。 - Claus Jørgensen
@Phil,现在是4,但我刚刚在图像中削掉了另外2个。 - user60456
3个回答

4
我的猜测是因为@post.User.Name部分正在为每个记录执行。原始查询返回了2个结果吗?
最好的解决方法是在原始查询中进行选择,以获取您想要的所有信息(标题、ID和用户名)。

1
该查询正在获取每个用户的用户名。参数@p0是用户ID。如果您检查其值,您很可能会发现它在每个查询中都是不同的。

0

Linq语句不会被执行两次。第一个查询来自Linq语句,我猜测第二个和第三个查询是来自你的@foreach循环。


Linq是延迟执行的,所以我认为我甚至不会看到来自那个查询的结果。对吗? - user60456
我的意思是,我只会从我的foreach循环中看到查询。 - user60456
Linq是延迟执行的,但看起来有些东西导致该语句被评估。第一个查询正是您在Linq语句中编写的内容。其他两个查询与该Linq语句无关。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接