views:

35

answers:

1

Hello all.

I'm struggling with a join/where clause with what is a rather simple sql select statement.

I am trying to retrieve a list of product information from tb1 with the where condition behind situated in tbl2 but this must be joined by three different columns.

so the SQL would look something along the lines of:

SELECT     tb1.*
FROM         tb2 INNER JOIN
                      tb1 ON tb2.Col1 = tb1. Col1 AND tb2.Col2 = tb1. Col2 AND 
                      tb2.Col3 = tb1.Col3
WHERE     (tb2.Col1 = col1) AND (tb2.Col2 = col2) AND (tb2.Col4 = string)

ColX is the main where clause with the string to be passed in as parameter; all other columns are within the contexts.

How do you implement multiple joins with a where clause?

And shoves in the right direction, muchly appreciated.

+3  A: 

To join on multiple field in LINQ, you have to create a new anonymous type containing the columns you want to compare and then use that anonymous type in the join:

var results = from t1 in context.tb1
              join t2 in context.tb2
              on new { t1.Col1, t1.Col2, t1.Col3 } equals
                  new { t2.Col1, t2.Col2, t2.Col3 }
              where t2.Col1 == col1 && t2.Col2 == col2 && t2.Col4 == someString
              select t1;

And here is the equivalent Lambda Syntax:

var results = context.tb1.Join(
                  context.tb2,
                  t1 => new { t1.Col1, t1.Col2, t1.Col3 },
                  t2 => new { t2.Col1, t2.Col2, t2.Col3 },
                  (t1, t2) => new { t1, t2 })
              .Where(o => o.t2.Col1 == col1 
                  && o.t2.Col2 == col2
                  && o.t2.Col4 == someString)
              .Select(o => o.t1);

As you can see, in the case of joins, query syntax usually produces an easier to read statement.

Justin Niessner
Legend - thanks Justin. I think if I had continued to scrape around for another 3 hours, trial and error would have got me here!! Thanks a lot.
Ricardo Deano
Is it possible to do this in method structure (fluent interfaces)?
Maxim Zaslavsky
@Maxim Zaslavsky - Do you mean using Lambda Syntax?
Justin Niessner
@Justin here's an example of what I mean: `var results = db.TableName.Where(t=>t.SomeProperty==SomeValue);` - is that called Lambda Syntax? Thanks!
Maxim Zaslavsky
@Maxim Zaslavsky - Yes. That is Lambda Syntax.
Justin Niessner