Edited
Solution using or rather than union ! It seems there is a problem with linq2sql w.r.t selecting a relation post a UNION msdn's social forums also indicate it as so
Intent To get WCtegories & WPBands having items ("W") and each item with either a price or an offer specified
Sql just works fine but linq is bugging out with errors The column prefix 't2' does not match with a table name or alias name used in the query. The inner query can not access outer query's variable.
Could some help me out with linq on how exactly to achieve this ?
Sql
SELECT  *
FROM    [WCategories] AS a
        JOIN [WPbands] AS b ON ( a.[CategoryId] = b.[WCategoryId] )
        JOIN [W] AS c ON ( a.[CategoryId] = c.[CategoryId] )
WHERE   a.[Visible] = 1 AND b.[Visible] = 1 AND c.[Visible] = 1
        AND c.[WineId] IN        
        (
            SELECT [WId] FROM [VWPrices] 
            WHERE [WId] = c.[WId] AND 
            [Price] BETWEEN b.[Floor] AND b.[Ceiling]
            UNION
         SELECT [WId] FROM [VWOffers]
         WHERE [WId] = c.[WId] AND 
         [Price] BETWEEN b.[Floor] AND b.[Ceiling] AND
         GETDATE() BETWEEN [StartDt] AND [EndDt]
        )
Linq
    from a in _db.WCategories
join b in _db.WPbands on a.CategoryId equals b.WCategoryId 
join c in _db.W on a.CategoryId equals c.CategoryId
where
  a.Visible &&   b.Visible && c.Visible &&
    (
     (
      from t in _db.VWPrices
      where
        t.WId == c.WId &&
        t.Price >= b.Floor && t.Price <= b.Ceiling
      select t.WId
     ).Union
     (
      from s in _db.VWOffers
      where
        s.WId == c.WId &&
        s.Price >= b.Floor && s.Price <= b.Ceiling &&
        DateTime.Now >= s.StartDt && DateTime.Now <= s.EndDt
      select s.WId
     )
    ).Contains(c.WId)
select new {a.Name,  b.Tag}
Sql being generated by Linq is as follows
     EXISTS ( 
      SELECT NULL AS [EMPTY]
                FROM ( 
                         SELECT    [t5].[WId]
                             FROM      (....) AS [t5]                                        
                         ) AS [t6]
            WHERE    [t6].[WId] = [t2].[WId] ) )
could some one pls explain why "Select NULL AS [Empty]" is being added during generation ? if i were to delete t6 everything is fine with the generated sql