¿Cuál es la forma 'moderna' de encontrar elementos comunes en dos Listas <T> de objetos?

Tengo dos listas genéricas que contienen diferentes tipos, por ejemplo, llamémoslasProducts yEmployees. Estoy tratando de encontrar productos que se basan en la misma ubicación que los empleados, es decir, dondeproduct.SiteId == emp.SiteId

List<Product> lstProds;
List<Employees> lstEmps;

i cerebro (viejo skool) me dice que use unforEach loop para encontrar las coincidencias, pero sospecho que hay una forma ('¿mejor' / terser / más rápida?) de hacerlo utilizando Linq. ¿Alguien puede iluminarme? Todos los ejemplos que he encontrado en línea tratan con listas de primitivas (cadenas / ints) y no son especialmente útiles.

Respuestas a la pregunta(1)

Su respuesta a la pregunta