我有2个表格,简化形式如下:
Products( id: int, name: varchar ); ProductSpecs( product_id: int, spec_name: varchar, spec_value: int );
现在我需要通过某些规范项的值(例如"价格")对产品(在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;
问题是,如果没有具有spec_name"price"的ProductSpec,则根本不包含该产品.我可以使用Union或Concat添加这些产品,但这样就不会保留第一部分的排序.
处理这个问题的最佳方法是什么?
谢谢.
首先,我建议你在纯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
话虽如此,这里有一些奇怪的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一样排序它们并返回空结果行.
希望这个有效!