我有一个类需要在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域类实现。
答案 0 :(得分:1)
var projection = DataContext.GetTable<Foo>
.AsEnumerable()
.Select(f => f.SetRetrievalTimeAndReturnSelf());
当SetRetrievalTimeAndReturnSelf
被迭代时,这将为Foo
中DataContext.GetTable<Foo>
的每个实例执行IEnumerable<Foo> projection
的调用。
您需要知道对象被数据库抽出的时间是什么时候?那可能很臭。