您好我知道如何在使用linq时选择“case”条件吗? 注释掉的代码是我的问题。我怎么把条件放在那里? 我的代码:
var r = from u in Users
join p in Payments on u.Id equals p.UserId
join soi in SaleOrderItems on p.ReferenceId equals soi.Id
//if soi.InventoryTypeId == 1
//then join i in Inventories on soi.InventoryOrCourseId equals i.Id
//elseif soi.InventorytypeId ==2
//then join c in Courses on soi.InventoryOrCourseId equals c.Id
where u.Id == 5
select new{ u, p, soi, either i or c};
答案 0 :(得分:2)
你必须使用一些外连接技巧来实现这一点,一个简单的方法是通过DefaultIfEmpty()
。基本上,您创建一个内部联接,然后使用缺少的行展开它:
var r = from u in Users
join p in Payments on u.Id equals p.UserId
join soi in SaleOrderItems on p.ReferenceId equals soi.Id
join i in Inventories on new {a = soi.InventoryTypeId, b = soi.InventoryOrCourseId } equals new {a = 1, b = i.Id} into g1
from oi in g1.DefaultIfEmpty()
join c in Courses on new {a = soi.InventoryTypeId, b = soi.InventoryOrCourseId } equals new {a = 2, b = c.Id} into g2
from oc in g2.DefaultIfEmpty()
where u.Id == 5
select new{ u, p, soi, ic = oi ?? oc};
注意最后一个语句ic = oi ?? oc
,因为类型不同,匿名类型将使用System.Object声明,因此它可以容纳这两种类型,如果你想使用强类型支持,也许更好的选择是返回oc和ic然后测试。你最好根据你在晚期使用这个查询的方式来决定。