Note that there are some explanatory texts on larger screens.

plurals
  1. POAdvanced multiple join in subquery using LINQ
    primarykey
    data
    text
    <p>I have spent the afternoon trying to wrap my mind around how to translate the following query into LINQ, but I can't quite get there.</p> <pre><code>declare @productId int; set @productId = 3212; select * from InformationData data where productId = @productId and orgId = 1 and exists( select id from ( select coalesce(id1.id, id2.id, id3.id) as id from ( select productId,attributeId from InformationData where productId = @productId group by productId,attributeId ) id left outer join InformationData id1 on id1.productId = id.productId and id1.attributeId = id.attributeId and id1.language = 1 left outer join InformationData id2 on id2.productId = id.productId and id2.attributeId = id.attributeId and id2.language = 2 left outer join InformationData id3 on id3.productId = id.productId and id3.attributeId = id.attributeId and id3.language = 0 ) row where row.id = data.id ) </code></pre> <p>The purpose of the query is to fetch data from a table using 2 fallback languages, so if the data does not exist in language 1, it is fetched in language 2, and if 2 does not exists it is fetched for language 0 which is a global translation.</p> <p>I can get the inner query mostly correct (except from id1.language = 1, I can't seem to get it to join on a member of the table I'm joining to, any ideas?)</p> <p>This is my code (LINQPad code):</p> <pre><code>( from data in ( from d in InformationData where d.ProductId == 3212 group d by new { d.ProductId, d.AttributeId } into p select new { ProductId = p.Key.ProductId, AttributeId = p.Key.AttributeId } ) join x1 in InformationData on new { a = data.ProductId, b = data.AttributeId } equals new { a = x1.ProductId, b = x1.AttributeId } into f1 from r1 in f1.DefaultIfEmpty() where r1.Language == 1 join x2 in InformationData on new { a = data.ProductId, b = data.AttributeId } equals new { a = x2.ProductId, b = x2.AttributeId } into f2 from r2 in f2.DefaultIfEmpty() where r2.Language == 2 join x3 in InformationData on new { a = data.ProductId, b = data.AttributeId } equals new { a = x3.ProductId, b = x3.AttributeId } into f3 from r3 in f3.DefaultIfEmpty() where r3.Language == 2 select new { Id = ((int?)r1.Id) ?? ((int?)r2.Id) ?? r3.Id } ).Dump(); </code></pre> <p>Which generates the following SQL:</p> <pre><code>-- Region Parameters DECLARE @p0 Int SET @p0 = 3212 DECLARE @p1 Int SET @p1 = 2 DECLARE @p2 Int SET @p2 = 2 DECLARE @p3 Int SET @p3 = 1 -- EndRegion SELECT COALESCE([t2].[id],COALESCE([t3].[id],[t4].[id])) AS [Id] FROM ( SELECT [t0].[productId], [t0].[attributeId] FROM [InformationData] AS [t0] WHERE [t0].[productId] = @p0 GROUP BY [t0].[productId], [t0].[attributeId] ) AS [t1] LEFT OUTER JOIN [InformationData] AS [t2] ON ([t1].[productId] = [t2].[productId]) AND ([t1].[attributeId] = [t2].[attributeId]) LEFT OUTER JOIN [InformationData] AS [t3] ON ([t1].[productId] = [t3].[productId]) AND ([t1].[attributeId] = [t3].[attributeId]) LEFT OUTER JOIN [InformationData] AS [t4] ON ([t1].[productId] = [t4].[productId]) AND ([t1].[attributeId] = [t4].[attributeId]) WHERE ([t4].[language] = @p1) AND ([t3].[language] = @p2) AND ([t2].[language] = @p3) </code></pre> <p>But I can't put this together with the rest of the query, maybe I'm just tired buy I keep getting it to do a lot of CROSS APPLY's. Does anyone have any suggestions?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload