我的班级GreenGroup
继承自抽象Group
。 GreenGroup
具有未映射的属性State
,该属性在分部类中定义。
我有一个方法GetGreenGroups(GroupFilter filter)
,它应该返回一个GreenGroup对象列表,其中State == filter.State。
public List<GreenGroup> GetGreenGroups(GroupFilter filter)
{
IQueryable<VirtualMachineInfo> result = GetAllGroupsInternal(userContext);
if(filter.OwnerId != Guid.Empty)
{
result = result.Where(g => g.OwnerID == filter.OwnerId);
}
// this is the unmapped property
if(filter.State.IsNotNullOrEmpty())
{
result = result.Where(g => g.State == filter.State);
}
// This will throw Class Member Unmapped exception
return new List<GreenGroup>(result);
}
但是,由于State
不是数据库中的字段,这是否意味着我不能将其包含在我的linq查询中,但是在查询返回后还需要进一步过滤我的列表?
我查看了一些网站,包括此one,其中用户收到相同的异常Class Member unmapped
,但该字段位于其数据库中,因此它看起来不像显式强制转换我出去了。
我唯一可以选择拆分过滤吗?
public List<GreenGroup> GetGreenGroups(GroupFilter filter)
{
IQueryable<VirtualMachineInfo> result = GetAllGroupsInternal(userContext);
if(filter.OwnerId != Guid.Empty)
{
result = result.Where(g => g.OwnerID == filter.OwnerId);
}
var groups = new List<GreenGroup>(result);
if(filter.State.IsNotNullOrEmpty())
{
groups = (from g in groups where g.State == filter.State select g).ToList();
}
return groups;
}
答案 0 :(得分:2)
您可以在select子句中使用部分类中的未映射字段,但不能在where子句中使用。对于select子句,LINQ to SQL会对整个对象进行水合,然后根据需要执行select投影。对于其他子句(其中/ order by / etc),LINQ to SQL引擎要求数据库中存在列以执行适当的操作。如果必须在where子句中使用unmapped属性,则必须在使用unmapped属性之前强制从IQueryable到IEnumerable的查询。不幸的是,这要求超集在客户端水合并且查询操作的其余部分在客户端执行,这可能是性能瓶颈。在您的示例中,最终的If子句类似于以下内容:
IEnumerable<GreenGroup> groups;
if(filter.State.IsNotNullOrEmpty())
groups = (from g in groups.ToEnumerable() where g.State == filter.State select g);