Select values from two collections I have a model:

class ColumnItsValues
{
    public int PropertyID { get; set; }
    public string ColumnName { get; set; }
    public string ValueOfColumn { get; set; }
}


two collections:

List&lt;ColumnItsValues&gt; listColumns = new List&lt;ColumnItsValues&gt;()
{
   new ColumnItsValues() {ColumnName="GUID", PropertyID=0, ValueOfColumn=null },
   new ColumnItsValues() {ColumnName="Name", PropertyID=1, ValueOfColumn=null },
   new ColumnItsValues() {ColumnName="Reference", PropertyID=2, ValueOfColumn=null },
   new ColumnItsValues() {ColumnName="Group", PropertyID=3, ValueOfColumn=null },
};

List&lt;ColumnItsValues&gt; listValues = new List&lt;ColumnItsValues&gt;()
{
    new ColumnItsValues() {ColumnName=null, PropertyID=1, ValueOfColumn="An user" },
    new ColumnItsValues() {ColumnName=null, PropertyID=2, ValueOfColumn="LIST of USERS" },
    new ColumnItsValues() {ColumnName=null, PropertyID=3, ValueOfColumn="False" },
    new ColumnItsValues() {ColumnName=null, PropertyID=0, ValueOfColumn=" " },
};


That's my linq query:

var fooColl = from columns in listColumns join values in listValues 
    on columns.PropertyID equals values.PropertyID
    select new { AColumn = columns.ColumnName, AValue = values.ValueOfColumn };


My question are:


in my view, I should use where operator, but I use equals. Is it correct?
Could you advice me more high-performance query?
I would convert your fooColl to this:

IEnumerable&lt;ColumnItsValues&gt; foolCols = listColumns.Join(listValues,
            columns =&gt; columns.PropertyID,
            values =&gt; values.PropertyID,
            (columns, values) =&gt; new ColumnItsValues 
                                 {
                                     ColumnName = columns.ColumnName,
                                     ValueOfColumn = values.ValueOfColumn
                                  });


in this way you're using a type you already know (ColumnItsValues), which make it more extendable/testable/readable.
About where == vs equals, I suggest to take a read to this blog post.

Alternatively, if as required by comments, you can change fooCols in this way:

IList&lt;ColumnItsValues&gt; foolCols = listColumns.Join(listValues,
            columns =&gt; columns.PropertyID,
            values =&gt; values.PropertyID,
            (columns, values) =&gt; new ColumnItsValues 
                                 {
                                     ColumnName = columns.ColumnName,
                                     ValueOfColumn = values.ValueOfColumn
                                  }).ToList();


or 

ColumnItsValues[] foolCols = listColumns.Join(listValues,
            columns =&gt; columns.PropertyID,
            values =&gt; values.PropertyID,
            (columns, values) =&gt; new ColumnItsValues 
                                 {
                                     ColumnName = columns.ColumnName,
                                     ValueOfColumn = values.ValueOfColumn
                                  }).ToArray();


Depends on which additional functionalities you need and on your final purpose. My choice usually is try to keep my objects as simple and lightweight as possible. Both the array and the list extends IEnumerable&lt;T&gt;: IList&lt;T&gt; gives the capability to insert/remove at a given index and, since it is an extension of ICollection&lt;T&gt; permits you Add, Clear or check if it Contains an element, on the other hand if you keep using arrays (ColumnValues[]) the lenght would be immutable.