Linq to SQL:在相关表中按值排序

Ala*_*ich 4 linq linq-to-sql

我有2个表格,简化形式如下:

Products(
   id: int,
   name: varchar
);

ProductSpecs(
   product_id: int,
   spec_name: varchar,
   spec_value: int
);
Run Code Online (Sandbox Code Playgroud)

现在我需要通过某些规范项的值(例如"价格")对产品(在linq到sql中)进行排序.所以我做这样的事情

var products = from p in db.Products
               from ps in p.ProductsSpecs
               where ps.spec_name == "price"
               orderby ps.spec_value
               select p;
Run Code Online (Sandbox Code Playgroud)

问题是,如果没有具有spec_name"price"的ProductSpec,则根本不包含该产品.我可以使用Union或Concat添加这些产品,但这样就不会保留第一部分的排序.

处理这个问题的最佳方法是什么?

谢谢.

Noa*_*oah 8

首先,我建议你在纯SQL中作为函数或存储过程执行此操作,然后通过linq访问它,或者在产品表中添加price列.即使价格为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
Run Code Online (Sandbox Code Playgroud)

话虽如此,这里有一些奇怪的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;
Run Code Online (Sandbox Code Playgroud)

我在上面的一些表设置上测试了这个并创建了5个产品,其中三个产品价格在不同的价值订单中,这个LINQ就像上面的SQL一样排序它们并返回空结果行.

希望这个有效!