Вот как я закончил работать.Огромное спасибо Андреасу за то, что он привел меня к NHibernate.OData.
В своем действии контроллера я получаю данные из URL и передаю их в функцию доступа к данным:
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();
}
Кроме того, для преобразования ICriteria в DetachedCriteria необходим простой класс ConvertedDetachedCriteria.
public class ConvertedDetachedCriteria : DetachedCriteria
{
public ConvertedDetachedCriteria(ICriteria criteria)
: base((CriteriaImpl)criteria, criteria)
{
var impl = (CriteriaImpl)criteria;
impl.Session = null;
}
}
Надеемся, что так и будетпомогите кому-нибудь еще.Теперь я могу писать запросы odata к моим методам веб-API asp.net и фильтровать их на уровне БД, что гораздо полезнее, чем фильтрация объектов c # !!