The 'as' filter can work, the 'is' filter doesn't, I think. I tried this query (5.9.3)
var metaData = new LinqMetaData(adapter);
var q = from e in metaData.Employee
        where (e as ManagerEntity).ManagesDepartmentId > 0 ||
               (e as BoardMemberEntity).CompanyCarId > 0 
        select e;
which results in
SELECT DISTINCT [LPA_L1].[EmployeeID]           AS [F7_0],
                [LPA_L1].[Name]                 AS [F7_1],
                [LPA_L1].[StartDate]            AS [F7_2],
                [LPA_L1].[WorksForDepartmentID] AS [F7_3],
                [LPA_L2].[ClerkID]              AS [F4_4],
                [LPA_L2].[JobDescription]       AS [F4_5],
                [LPA_L3].[ManagerID]            AS [F12_4],
                [LPA_L3].[ManagesDepartmentID]  AS [F12_5],
                [LPA_L4].[BoardMemberID]        AS [F2_6],
                [LPA_L4].[CompanyCarID]         AS [F2_7]
FROM   ((([InheritanceTwo].[dbo].[Employee] [LPA_L1]
          LEFT JOIN [InheritanceTwo].[dbo].[Clerk] [LPA_L2]
              ON [LPA_L1].[EmployeeID] = [LPA_L2].[ClerkID])
         LEFT JOIN [InheritanceTwo].[dbo].[Manager] [LPA_L3]
             ON [LPA_L1].[EmployeeID] = [LPA_L3].[ManagerID])
        LEFT JOIN [InheritanceTwo].[dbo].[BoardMember] [LPA_L4]
            ON [LPA_L3].[ManagerID] = [LPA_L4].[BoardMemberID])
WHERE  ((([LPA_L3].[ManagesDepartmentID] > @p1)
      OR ([LPA_L4].[CompanyCarID] > @p2))) 
So you don't need to do an is + as, you can just do a temporary cast to as, it won't fail at runtime as SQL will happily filter on a resultset with NULL values 