从RavenDB加载对象

时间:2015-08-07 19:32:30

标签: asp.net refactoring ravendb

我正在尝试对项目进行一些重构。我想替换行之间的代码以及它上面的两条注释行,这样我就可以在需要引用对象的另一个页面上使用它

        //quote.LoadActive();
        //QuoteID = quote.Id;

        //--------------------------------------------------------
        List<Quote> DBquotes = session.Query<Quote>()
            .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
            .ToList();

        foreach (Quote q in DBquotes)
        {
            if (q.IsActive)
            {
                QuoteID = q.Id;
                quote = session.Load<Quote>(q.Id);
            }
        }
        //--------------------------------------------------------

这是Quote类

中的LoadActive()函数
    public Quote LoadActive()
    {
        List<Quote> DBquotes = session.Query<Quote>()
            .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
            .ToList();

        foreach (Quote q in DBquotes)
            if (q.IsActive)
                return session.Load<Quote>(q.Id);

        return new Quote();
    }

但我不知道如何实际更新引用对象。我不能在没有逐个元素的情况下更新函数内部,这太繁琐了。如果我尝试并报价= quote.LoadActive(),那么它会抱怨报价尚未初始化。我确定有一种方法可以设置我正在尝试做的事情,但我正在消隐,并且想不出好的关键词来谷歌我的问题。我甚至无法为这篇文章提出一个好的主题措辞!

编辑:tl; dr我需要将活动报价加载到页面使用的'quote'对象中。这些行之间有什么作用,我想用上面的注释行(或类似的东西)替换所有行。

2 个答案:

答案 0 :(得分:0)

你的引用对象不应该负责访问数据库。你应该使用一些数据访问类,或者甚至更好,Query Handler来访问数据库。

我认为你可能会对代码的作用感到困惑。让我试着解释一下。

  public Quote LoadActive()
    {
       //This call returns every Quote Document in the DB
       //RavenDB by default will only return a Max of 128 w/out doing paging

        List<Quote> DBquotes = session.Query<Quote>()
            .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
            .ToList();

     //This doesn't make any sense. You're saying the first quote that is active, 
     //make another expensive DB call and return the same object.
     //I still don't know what you want to do, but you already have the quote object 
     //why would you go to the DB and get something that you already have?

        foreach (Quote q in DBquotes)
            if (q.IsActive)
                return session.Load<Quote>(q.Id);//Unnecessary, you have the Quote already
               //return q;

        return new Quote(); //if there's no active quotes just return an Empty Quote Object
    }

您是否尝试从数据库返回所有活动报价? 你可以这样做

var activeQuotes = session.Query<Quote>()
                   .Where(x => x.IsActive == true)
                   .ToList();//Remember, RavenDB's safe by default feature 
                             //will only return 128 records, you have to
                             //implement paging

答案 1 :(得分:-1)

如果您只想返回第一个IsActive引号(这是您希望从代码中执行的操作),您只需执行以下操作:

    public Quote LoadActive()
    {
        return session.Query<Quote>()
            .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
            .FirstOrDefault(x => x.IsActive);
    }

根据评论进行编辑: 这将允许您通过

完成您想要的任务
QuoteId = quote.LoadActive().Id;