【发布时间】:2017-02-25 20:15:51
【问题描述】:
我有 3 个通过外键链接的表:ChangeSet、ObjectChanges、PropertyChanges。这些表彼此之间具有一对多的关系。我需要加入并投影并将结果展平为匿名类型。
我们在数据层使用实体框架,我基本上需要使用 linq 进行以下查询。
select c.Id as ChangeSetId,
c.Timestamp,
c.Author_Id,
u.Name as [User],
o.id as ObjectChangeId,
o.TypeName,
o.ObjectReference as EntityId,
o.DisplayName,
p.Id as PropertyChangeId,
p.PropertyName,
p.ChangeType,
p.OriginalValue,
p.Value
from ChangeSets c
inner join ObjectChanges o
on c.Id = o.ChangeSetId
left join PropertyChanges p
on p.ObjectChangeId = o.Id
inner join Users u
on u.Id = c.Author_Id
order by c.id desc
然而,有问题的方法看起来像这样:
GetAllWhereExpression(Expression<Func<ChangeSet, bool>> expression)
这种情况下的表达式很可能是一个 Where o.EntityId = [Some Value] and c.TimeStamp > X and
我在 linq 中感觉非常接近,但不知道如何注入表达式:(.GetRepository().Entities 基本上是 DbSet)
var foo = from c in _uow.GetRepository<ChangeSet>().Entities
join o in _uow.GetRepository<ObjectChange>().Entities on c.Id equals o.ChangeSetId
join p in _uow.GetRepository<PropertyChange>().Entities on o.Id equals p.ObjectChangeId
where expression // This Line Not Valid
select new
{
ChangeSetId = c.Id,
Timestamp = c.Timestamp,
User = c.User.DisplayName,
EntityType = o.TypeName,
EntityValue = o.DisplayName,
Property = p.PropertyName,
OldValue = p.OriginalValue,
NewValue = p.Value
};
我更喜欢使用 Lambda 语法,但我不知道如何构造它。我知道我需要 SelectMany 来投影和展平结果,但我不知道如何在子集合的匿名类型中使用它们:
var queryable = _uow.GetRepository<ChangeSet>().Entities // This is basically the DbSet<ChangeSet>()
.Where(expression)
.SelectMany(c => new
{
ChangeSetId = c.Id,
Timestamp = c.Timestamp,
User = c.User.DisplayName,
EntityType = c.ObjectChanges.SelectMany(o => o.TypeName), //Doesn't work, turns string into char array
//PropertyName = c. this would be a 1 to many on the entity
}
)
如何制作 linq 以产生与 sql 查询基本相同的结果?
【问题讨论】:
标签: c# entity-framework linq lambda