查询未映射的类成员

时间:2011-03-17 20:10:09

标签: c# linq-to-sql

我的班级GreenGroup继承自抽象GroupGreenGroup具有未映射的属性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;
}

1 个答案:

答案 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);