Изменение выбранных объектов внутри запроса - PullRequest
0 голосов
/ 02 февраля 2010

У меня есть класс, которому нужно установить свойство внутри запроса 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.

1 Ответ

1 голос
/ 02 февраля 2010
var projection = DataContext.GetTable<Foo>
                            .AsEnumerable()
                            .Select(f => f.SetRetrievalTimeAndReturnSelf());

Затем будет выполнен вызов SetRetrievalTimeAndReturnSelf для каждого экземпляра Foo в DataContext.GetTable<Foo>, когда IEnumerable<Foo> projection повторяется.

Что вам нужно знать, когдаэтот объект был вырван из базы данных для?Это потенциально вонючий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...