Q:

Getting the difference between two Lists based on certain fields

I'm fairly new to LINQ and I may have painted myself to a corner here.  I have two lists (left and right) and I need to:
a) Get matching items based on certain fields
b) Get items on the left with no match on the right 
c) Get items on the right with no match on the left
A match is found if certain fields are equal.  Other fields may or may not contain values but must not influence the match comparison. 
To get item a I performed a JOIN on both lists:
var q = from a in r1
        from b in r2
        where a.Prop1 == b.Prop1 && a.Prop3 == b.Prop3
        select new { a.Prop1, a.Prop2, b.Prop3 };

I'm not sure on where to go from here.  I think I cannot use .Except() because the other properties for both lists will be different and may cause the comparison to break. 
I also tried using Left Join and get the items with no matches:
 var q =
     from c in r1
     join p in r2 on c.Prop1 equals p.Prop1
     into cp
     from p in cp. DefaultIfEmpty()
     select new { Prop1 = c.Prop1, Prop2 = p == null ? " N/A" : p. Prop2 };

however I found out that you can't compare more than one field to compare. 
Can you have more than one fields on a Left Join with LINQ? 
Are there other ways (besides LINQ) to get the difference between two lists? 

A:

This uses Intersect and Except (similar to Cuong Le's solution):
public class MyComparer : IEqualityComparer<YourClass>
{
    #region IEqualityComparer<YourClass> Members

    public bool Equals(YourClass x, YourClass y)
    {
        return
            x.Prop1.Equals(y. Prop1) && x.Prop3.Equals(y. Prop3);
    }

    public int GetHashCode(YourClass obj)
    {
        int hCode = obj. Prop1.GetHashCode() ^ obj. Prop3.GetHashCode();
        return hCode. GetHashCode();
    }

    #endregion
}

// matched elements from both lists
var r1 = l1.Intersect<YourClass>(l2, new MyComparer());
// elements from l1 not in l2
var r2 = l1.Except<YourClass>(l2, new MyComparer());
// elements from l2 not in l1
var r3 = l2.Except<YourClass>(l1, new MyComparer());

