我正在尝试对项目进行一些重构。我想替换行之间的代码以及它上面的两条注释行,这样我就可以在需要引用对象的另一个页面上使用它
//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'对象中。这些行之间有什么作用,我想用上面的注释行(或类似的东西)替换所有行。
答案 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;