我正在尋找有關從我的視圖模型抽象我的RIA域上下文,使他們的數據源不可知的最佳做法。看起來我能找到的最佳解決方案是here所述的服務代理模式。但是,如果我有一些相對複雜的查詢邏輯來執行呢?WCF RIA服務代理模式與複雜的查詢
例如,目前我在我的視圖模型中有我的域上下文。比方說,我有一個ContactSearchViewModel,那裏是參與構建搜索查詢了一下邏輯:
protected EntityQuery<Contact> CreateSearchQuery()
{
var query = Context.GetContactsQuery().Where(
e => e.First_Name.ToLower().StartsWith(FirstNameSearch.ToLower()) &&
e.Last_Name.ToLower().StartsWith(LastNameSearch.ToLower()));
if (!string.IsNullOrEmpty(Phone))
{
query = query.Where(q => q.Phone == Phone ||
q.Mobile == Phone ||
q.Work == Phone);
}
if (SelectedContactType == "Prospect")
{
query = query.Where(q => q.Contact_Type_Id == 1);
}
else if (SelectedContactType == "Customer")
{
query = query.Where(q => q.Contact_Type_Id == 2);
}
return query;
}
現在我當然也有一個簽名服務代理方法,看起來像public EntityList<Contact> SearchContacts(string firstName, string lastName, string phone, ContactType contactType)
但想象一下,如果我搜索查詢更加複雜 - 這個界面將變得笨拙。有沒有更好的選擇,我可以像在域上下文中一樣在VM中構建查詢?或者我應該吸收它並使用一些參數對象?
我非常希望能夠在虛擬機上構建查詢,因爲我目前有一小部分虛擬機,它們都使用基本搜索類和用於生成查詢的模板方法執行各種搜索,類似於
不能夠產生來自客戶端的查詢會導致大量重複的代碼,我用這個繼承結構固定。
我記得有一段時間我會在幾個小時內得到大量答案,提出這樣的問題。現在人們只會回答簡單的問題。 StackOverflow真的走下坡路了。 – 2011-02-07 21:26:05
我最近一直在思考同樣的問題。我對使VM數據源不可知(真的比看起來難得多)感興趣,但我肯定想要從DomainContext中分離出一些東西。我在想一個好方法可能是向返回EntityQuery的服務層添加一個'GetContactsQuery'方法,然後添加一個接受EntityQuery的'LoadContacts'方法。更好的方法可能是創建一個查詢類型來在服務代理中「重放」查詢。這兩種方法中的哪一種看起來都合理? – 2011-02-15 00:59:11