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