У меня есть класс, которому нужно установить свойство внутри запроса LINQ-to-SQL. Моей первой попыткой было создание метода «setter», который возвращал бы экземпляр объекта и мог бы использоваться в моем выборе, например:
public partial class Foo
{
public DateTime RetrievalTime { get; set; }
public Foo SetRetrievalTimeAndReturnSelf ( DateTime value )
{
RetrievalTime = value;
return this;
}
}
....
from foo in DataContext.GetTable<Foo> select foo.SetRetrievalTimeAndReturnSelf();
К сожалению, такой запрос вызывает исключение, подобное следующему: «System.NotSupportedException: метод 'Foo.SetRetrievalTime (System.DateTime)' не поддерживает перевод в SQL".
Есть ли альтернатива преобразованию результата в список и повторению по нему? Запрос используется в пользовательском методе «Get», который обертывает метод DataContext.GetTable, поэтому будет использоваться в качестве основы для многих других запросов. Немедленное преобразование потенциально большого результирующего набора в список не будет оптимальным.
UPDATE
Вот лучший пример того, что я пытаюсь сделать, обновленный предложенным Джейсоном решением:
protected IQueryable<T> Get<T>() where T : class, ISecurable
{
// retrieve all T records and associated security records
var query = from entity in DataContext.GetTable<T> ()
from userEntityAccess in DataContext.GetTable<UserEntityAccess> ()
where userEntityAccess.SysUserId == CurrentUser.Id
&& entity.Id == userEntityAccess.EntityId
&& userEntityAccess.EntityClassName == typeof ( T ).Name
select new { entity, userEntityAccess };
return query.AsEnumerable ()
.Select ( item =>
{
item.entity.CanRead = item.userEntityAccess.CanRead;
item.entity.CanWrite = item.userEntityAccess.CanWrite;
item.entity.CanDelete = item.userEntityAccess.CanDelete;
return item.entity;
} ).AsQueryable ();
}
public interface ISecurable
{
int Id { get; set; }
bool CanRead { get; set; }
bool CanWrite { get; set; }
bool CanDelete { get; set; }
}
UserEntityAccess - это таблица перекрестных ссылок между пользователем и записью бизнес-объекта (то есть сущности). Каждая запись содержит поля, такие как «CanRead», «CanWrite» и «CanDelete», и определяет, что конкретный пользователь может делать с определенной записью.
ISecurable - это маркерный интерфейс, который должен быть реализован любым классом домена LINQ-to-SQL, которому необходимо использовать этот безопасный метод Get.