From your query, I think your code should looks like:
var query = (from table2 in metadata.T2
join table1 in metadata.T1 on table2.Id equals table1.Id
join table3 in metadata.T3 on table2.Id equals table3.Id
join table4 in metadata.T4 on table2.Id equals table4.Id
where t1.Current == MyDate && t4.Id ==2
select table2)
.WithPath(new PathEdge<T1Entity>(
T2Entity.PrefetchPathT1));
And, if your entities are actually related (the relations exits at LLBLGen Designer) the code could be:
var query = (from table2 in metadata.T2
where t2.Current == MyDate && t2.t3.t4.Id == 2
select table2)
.WithPath(new PathEdge<T1Entity>(
T2Entity.PrefetchPathT1));
Above options will return all T2 entities where t2.t1.Current == MyDate and t2.t3.t3.Id == 2. Added to that, the result will prefetch the T1 entity/entities related to each T2 entity.
Note that you can place the filter in a variety of places. That depends on how you want your results. For example:
At join level (this would generate a custom filter join). This should work but isn't needed in your case:
join table1 in metadata.T1.Where(t=>t.Current==MyDate) on table2.Id equals table1.Id
At query level. This will filter the whole results.
var query = (from table2 in metadata.T2
where t2.t1.Current == MyDate && t2.t3.t4.Id == 2
select table2)
.WithPath(new PathEdge<T1Entity>(
T2Entity.PrefetchPathT1));
At prefetchPath level. In this case you will return all entities. And, for each entity you will get the involved related path filtered. For example: all customers prefetching only the orders whose employeeId is equal to 3:
var query = (from table2 in metadata.T2
select table2)
.WithPath(new PathEdge<T1Entity>(
T2Entity.PrefetchPathT1, tt => tt.Current == MyDate));