這裏是我最終得到它的工作。非常感謝Andreas帶領我到NHibernate.OData。
在我的控制器動作我從URL中的OData並把它傳遞到我的數據訪問功能:
public IQueryable<Message> GetAll(int authUserId, int userId, DateTime? startDate, DateTime? endDate)
{
LogWriter.Write(String.Format("Getting all messages for user {0}", userId));
//get messages and convert to view.
return from m in MessageData.FindAll(userId, startDate, endDate, GetOData())
select new Message(m);
}
protected string GetOData()
{
var odata = this.Request.RequestUri.Query;
odata = odata.Substring(odata.IndexOf("$"), odata.Length - odata.IndexOf("$"));
odata = odata.Replace("%20", " ");
return odata;
}
裏面的數據訪問方法,我們得到NHibernate會話和呼叫session.ODataQuery:
public static IQueryable<Message> FindAll(int userId, DateTime? startDate, DateTime? endDate, string odata)
{
ICriteria query = GetSession().ODataQuery<Message>(odata);
var detachedCriteria = new ConvertedDetachedCriteria(query)
.CreateAlias("MessageRecipients", "mr")
.Add(Restrictions.Or(
Restrictions.Eq("SenderUserId", userId),
Restrictions.Eq("mr.Key.RecipientId", userId)
));
return FindAllQueryable(detachedCriteria);
}
public static ISession GetSession()
{
var factory = ActiveRecordMediator.GetSessionFactoryHolder().GetSessionFactories()[0];
return factory.OpenSession();
}
public static IQueryable<T> FindAllQueryable(DetachedCriteria criteria)
{
return ActiveRecordMediator<T>.FindAll(criteria).AsQueryable();
}
同樣,也需要一個簡單的ConvertedDetachedCriteria類,從的ICriteria轉換成的DetachedCriteria。
public class ConvertedDetachedCriteria : DetachedCriteria
{
public ConvertedDetachedCriteria(ICriteria criteria)
: base((CriteriaImpl)criteria, criteria)
{
var impl = (CriteriaImpl)criteria;
impl.Session = null;
}
}
希望這會幫助別人。我現在可以寫對我的asp.net網站API方法的OData查詢,並讓他們在分貝水平,這比過濾IQueryable的C#的對象更加有用的過濾!
也許這是一個選項:https://github.com/pvginkel/NHibernate.OData – Andreas 2012-03-05 20:10:58
@Andreas - 感謝您的建議,但是我無法弄清楚如何將NHibernate.OData集成到Castle ActiveRecord中。 :( – Justin 2012-03-05 21:46:15