Во-первых, я бы порекомендовал вам сделать это на чистом SQL как функцию или хранимую процедуру, а затем получить к нему доступ через linq или добавить столбец цен в таблицу продуктов. Кажется, что цена будет нормальным атрибутом, добавляемым ко всем вашим продуктам, даже если эта цена равна NULL.
SQL:
select p.*
from products p
left outer join productspecs ps on
p.id = ps.product_id
and ps.spec_name = 'Price'
order by ps.spec_value
С учетом вышесказанного, вот странный бит LINQ, который должен работать на вашей таблице (возможно, некоторые имена столбцов написаны неправильно):
var products = from p in db.Products
join ps in (from pss in db.ProductSpecs
where pss.spec_name== "Price"
select pss
) on p.id equals ps.product_id into temp
from t in temp.DefaultIfEmpty()
orderby t.spec_value
select p;
Я проверил это на некоторых настройках таблиц, как описано выше, и создал 5 продуктов, три с ценами в разных порядках значений, и этот LINQ упорядочил их так же, как и в приведенном выше SQL, и также возвратил нулевые строки результата.
Надеюсь, это работает!