更改查询中的选定对象

时间:2010-02-02 17:43:31

标签: c# linq-to-sql

我有一个类需要在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:Method'Foo.SetRetrievalTime(System.DateTime)'没有支持的SQL转换”。

有没有其他方法可以将结果转换为列表并迭代它?该查询用于包装DataContext.GetTable方法的自定义“Get”方法,因此将用作许多其他查询的基础。立即将可能较大的结果集转换为列表将不是最佳的。

更新

以下是我正在尝试做的更好的例子,更新了Jason提出的解决方案:

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”等字段,并确定特定用户可以对特定记录执行的操作。

可执行是一个标记接口,必须由需要使用此安全Get方法的任何LINQ-to-SQL域类实现。

1 个答案:

答案 0 :(得分:1)

var projection = DataContext.GetTable<Foo>
                            .AsEnumerable()
                            .Select(f => f.SetRetrievalTimeAndReturnSelf());

SetRetrievalTimeAndReturnSelf被迭代时,这将为FooDataContext.GetTable<Foo>的每个实例执行IEnumerable<Foo> projection的调用。

您需要知道对象被数据库抽出的时间是什么时候?那可能很臭。