linq加入案例条件

时间:2011-02-10 06:13:35

标签: linq

您好我知道如何在使用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};

1 个答案:

答案 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然后测试。你最好根据你在晚期使用这个查询的方式来决定。