LINQ to EF 子查询

LINQ to EF Sub query

我有两个 linq 查询,在第二个查询中我使用第一个查询作为子查询。基本上,第一个查询对 return 不同的 ContactID 行执行 groupby 以在第二个查询中使用,然后对 idnumber 执行 groupby 以检查重复项。

private IQueryable<Contact> GetDistinctContact()
{

    IQueryable<Contact> query = (from contact in context.Contacts
                                 where contact.EDITED.Equals(0)
                                 && contact.NOTACTIVE.Equals(false)
                                 && contact.ID > 10001
                                 join client in context.Clients on new { ClientID = contact.ID, EDITED = 0, DELETED = false }
                                 equals new { ClientID = client.ContactID, EDITED = client.EDITED, DELETED = client.DELETED }
                                 join member in context.Members on new { MemberID = client.ID, EDITED = 0, DELETED = false }
                                 equals new { MemberID = member.ClientID, EDITED = member.EDITED, DELETED = member.DELETED }
                                 select contact);

    return query.GroupBy(x => x.ID).Select(grp => grp.FirstOrDefault());
}


IQueryable<ContactDetailsViewModelPart> query = (from contact in GetDistinctContact()
                                                 where contact.IdNumber != null
                                                 && !contact.IdNumber.Trim().Equals("")
                                                 && contact.EDITED.Equals(0)
                                                 && contact.NOTACTIVE.Equals(false)
                                                 && contact.ID > 10001
                                                 group contact
                                                 by new ContactDetailsViewModelPart
                                                 {
                                                     IDNumber = contact.IdNumber,
                                                     LastName = contact.LastName
                                                 }
                                                 into idNumberGroup
                                                 where idNumberGroup.Count() > 1
                                                 select new ContactDetailsViewModelPart
                                                 {
                                                    IDNumber = idNumberGroup.Key.IDNumber,
                                                    LastName = idNumberGroup.Key.LastName
                                                });

return query.ToList();   

这是我得到的错误。我正在使用 Firebird 数据库。

动态SQL错误 SQL 错误代码 = -104 令牌未知 - 第 19 行,第 9 列 申请

EF 在子查询上交叉应用生成 SQL。我知道这在更高版本的 Firebird 中不受支持。还有其他选择吗?

我认为第一个查询可以去掉(我猜contact.ID是一个主键),然后使用这样的东西:

var query =
    from contact in context.Contacts
    where contact.IdNumber != null
    && !contact.IdNumber.Trim().Equals("")
    && contact.EDITED.Equals(0)
    && contact.NOTACTIVE.Equals(false)
    && contact.ID > 10001
    && context.Clients.Any(client =>
        client.ContactID == contact.ID && client.EDITED == contact.EDITED && client.DELETED == contact.EDITED
        && context.Members.Any(member =>
            member.ClientID == client.ID && member.EDITED == client.EDITED && member.DELETED == client.DELETED
        )
    )
    group contact
    by new ContactDetailsViewModelPart
    {
        IDNumber = contact.IdNumber,
        LastName = contact.LastName
    }
    into idNumberGroup
    where idNumberGroup.Count() > 1
    select idNumberGroup.Key;
return query.ToList();

通常 Any 会被翻译成 SQL EXISTS 子查询,而大多数数据库会将其视为 INNER JOIN。不幸的是,我不知道 Firebird 是否这样做,但值得一试。