延迟加载转发器有linq查询不产生结果

时间:2013-11-18 20:47:31

标签: c# mysql linq linq-to-mysql

所以我懒得加载转发器控件:

要遵循的代码将转发器绑定到guestbookData属性,该属性由loadGuestbook()填充

public partial class _Default
{
    private DataTable _guestbookData;
    public DataTable guestbookData
    {
        get
        {
            if (_guestbookData == null)
            {
                _guestbookData = loadGuestbook();
            }
            return _guestbookData;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataBind();
        }
    }

    private DataTable loadGuestbook()
    {
        netguestData nd = new netguestData();
        List<post> data = nd.GetPosts(10, rptGuestbook.Items.Count);

        DataTable dt = new DataTable();
        // writing the list to a DataTable for bind happens here.
        // not sure how to cast IEnumerable to DataTable, else I'd do that

        return dt;
    }

    protected void btnLoadMore_Click(object sender, EventArgs e)
    {
        DataBind();
    }
}

使用LINQ To SQL从数据库中查询数据。这是我正在使用的GetPosts(int,int)函数:

public class netguestData
{
    private netguestEntities ne = new netguestEntities();

    public netguestData()
    {

    }

    public List<post> GetPosts(int Take, int Skip)
    {
        var posts = (from p in ne.posts
                    .OrderByDescending(p => p.postdate)
                    .Take(Take)
                    .Skip(Skip)
                    select p).ToList();
        return posts;
    }
}

现在,为了解决这个问题,我基本上每页加载10行,并使用转发器中的项目数作为参考,以便跳过所选数据中的行数。

当页面第一次加载时,我得到了我最初的10条记录而没有任何问题,但是当我点击按钮加载下一组时,它会显示为空白。

调试器中的消息是:

  

枚举没有产生结果

我在点击后检查了TakeSkip值,两者都是10,正如预期的那样。表中有200多行,所以我无法理解问题所在。

有人可以建议我做些什么来解决这个问题吗?

提前致谢!

2 个答案:

答案 0 :(得分:4)

你可能想先跳过然后跳。 (首先进行拍摄然后跳过没有多大意义。)

答案 1 :(得分:1)

通过您的查询推理:

    var posts = (from p in ne.posts
                .OrderByDescending(p => p.postdate)
                .Take(Take)
                .Skip(Skip)
                select p).ToList();

在第一次尝试时,您正在拍摄10个帖子并跳过那些10个的0个。 在接下来的尝试中,您将发布10个帖子并跳过10个那些10个,这显然没有结果。

正如它所写,你总是在查询10个最新的结果,除了你第一次跳过0,并跳过所有结果。

就像@Becuzz所说的那样,你只想交换跳过并接受,这样你就可以跳过原始查询中的结果返回并从余数中取出。

    var posts = (from p in ne.posts
                .OrderByDescending(p => p.postdate)
                .Skip(Skip)
                .Take(Take)
                select p).ToList();