Average extension method in Linq for default value

My advice would to create a reusable solution instead of a solution for this problem only.

Make an extension method AverageOrDefault, similar to FirstOrDefault. See extension methods demystified

public static class MyEnumerableExtensions
{
    public static double AverageOrDefault(this IEnumerable<int> source)
    {
        // TODO: decide what to do if source equals null: exception or return default?
        if (source.Any())
            return source.Average();
        else
            return default(int);
    }
}

There are 9 overloads of Enumerable.Average, so you'll need to create an AverageOrDefault for double, int?, decimal, etc. They all look similar.

Usage:

// Get the average order total or default per customer
var averageOrderTotalPerCustomer = myDbContext.Customers
    .GroupJoin(myDbContext.Orders,
    customer => customer.Id,
    order => order.CustomerId,
    (customer, ordersOfThisCustomer) => new
    {
        Id = customer.Id,
        Name  = customer.Name,
        AverageOrder = ordersOfThisCustomer.AverageOrDefault(),
    });

There is: DefaultIfEmpty.

I 'm not sure about what your DbVersions and DbRatings are and which collection exactly has zero items, but this is the idea:

var emptyCollection = new List<int>();
var average = emptyCollection.DefaultIfEmpty(0).Average();

Update: (repeating what's said in the comments below to increase visibility)

If you find yourself needing to use DefaultIfEmpty on a collection of class type, remember that you can change the LINQ query to project before aggregating. For example:

class Item
{
    public int Value { get; set; }
}

var list = new List<Item>();
var avg = list.Average(item => item.Value);

If you don't want to/can not construct a default Item with Value equal to 0, you can project to a collection of ints first and then supply a default:

var avg = list.Select(item => item.Value).DefaultIfEmpty(0).Average();