Getting price for one firm by week
The model you chose for your data is quite far from ideal. I guess that's one of the reasons your code became a little messy. However, even with this model, the end result can be reached in a more readable, and probably more efficient way:

var pricesPerWeek = weekPrices
    .Where(weekPrice =&gt; weekPrice.Year == DateTime.Now.Year)
    .SelectMany(
        (weekPrice) =&gt; weekPrice.Firms.Where(firm =&gt; firm.Name == "ABC"), 
        (week, firm) =&gt; new {week.Week, firm.Price})
    .ToList();


In this code, weekPrices is a List&lt;WeekPrice&gt;. This code first selects week prices from the current year. It then uses the overload SelectMany to flatten the list of week prices to a collection of anonymous objects with properties Week and Price.

A complete and working sample of this code can be found on dotnetfiddle.net.

However, as said before, your model is not ideal. I would refactor your model to three classes: Firm, Product and ProductPrice:

// Represents a firm you track.
public class Firm
{
    public Firm() 
    {
        Prices = new List&lt;ProductPrice&gt;();
    }

    public int Id {get;set;}
    public String Name {get;set;}
    public List&lt;ProductPrice&gt; Prices {get; private set;}
}

// Keeps record of the firm's price of a product at a certain moment 
public class ProductPrice
{
    public int FirmId {get;set;}
    public int ProductId {get;set;}
    public int Year {get;set;}
    public int Week {get;set;}
    public decimal Price {get;set;}
}

// Represents a product you track.
public class Product
{
    public int Id {get;set;}
    public String Description {get;set;}
}


This model has several advantages over your model. For instance, firms do not get a new Id every week. Instead, the firm's Id and Name are stored once. The same goes for products (although that isn't part of your question). All you have to do every week, is add an entry of type ProductPrice for all product-firm combinations.

And now, with this model, back to your question. To select the weeks and prices for a certain firm (and product) you can do:

var pricesPerWeek = firms
    .Where(firm =&gt; firm.Id == 1)
    .SelectMany(firm =&gt; firm.Prices)
    .Where(
        productPrice =&gt; productPrice.Year == DateTime.Now.Year &amp;&amp; 
        productPrice.ProductId == 1)
    .Select(productPrice =&gt; new {productPrice.Week, productPrice.Price})
    .ToList();


In this code, firms is a List&lt;Firm&gt;. This code first selects the correct firm, it then selects the correct weeks (and product) and then returns a collection of anonymous objects with properties Week and Price.

A complete and working sample of this code can be found on dotnetfiddle.net.