Для заданного набора сущностей, скажем WHO_TYPES, я хочу ограничить столбцы ID
и WHO_TYPE_NAME
.
Набор сущностей сам выставляется через:
config.SetEntitySetAccessRule("WHO_TYPES", EntitySetRights.AllRead);
... поэтому я не вижу, как это сделать при настройке правил доступа к сущности / таблице. Можно ли написать QueryInterceptor для достижения этой цели? Если да, то как?
Другая попытка, которую я сделал, - написать собственный метод, который ссылается на пользовательский объект:
[DataServiceKey("MY_WHO_TYPES")]
public partial class MY_WHO_TYPES
{
public MY_WHO_TYPES() { }
public int MY_WID { get; set; }
public string MY_WNAME { get; set; }
}
Мой пользовательский метод:
[WebGet]
public IQueryable<MY_WHO_TYPES> GetWhoTypesCustom()
{
var whoCustom = from w in this.CurrentDataSource.WHO_TYPES
select new MY_WHO_TYPES() { MY_WID = w.ID, MY_WNAME = w.WHO_TYPE_NAME };
return whoCustom.AsQueryable<MY_WHO_TYPES>();
}
При этой попытке я получаю следующее сообщение об ошибке:
Unable to load metadata for return type 'System.Linq.IQueryable`1[DAL.Models.MY_WHO_TYPES]' of method 'System.Linq.IQueryable`1[DAL.Models.MY_WHO_TYPES] GetWhoTypesCustom()'.
Я чувствую какой-то шаблон хранилища, появляющийся в ответе, но я надеюсь, что это может быть проще.
Предложение об использовании Tuple звучит хорошо, но я не совсем уверен, как его реализовать или какой будет тип возвращаемого значения:
select new { Tuple<int, string> (w.ID, w.WHO_TYPE_NAME)}; // error: Invalid anonymous type member declarator. Anonymous type members must be declared with a memeber assignment...
Затем я попытался просто вернуть анонимный тип:
[WebGet]
public IQueryable GetWhoTypesCustom()
{
var whoCustom = from w in this.CurrentDataSource.WHO_TYPES
select new { w.ID, w.WHO_TYPE_NAME };
return whoCustom;
}
Проблема в том, что я получаю сообщение об ошибке, указывающее, что тип IQueryable не определен.