将SQL转换为Lambda / Linq

时间:2016-10-27 08:13:25

标签: c# linq lambda

我一直试图将一段相当基本的SQL代码转换成Lamda或Linq,但我无处可去。这是SQL查询:

SELECT * FROM Form a 
INNER JOIN FormItem b ON a.FormId = b.FormId
INNER JOIN FormFee c ON a.FormId = c.FormId 
INNER JOIN FeeType d ON c.FeeTypeId = d.FeeTypeId
WHERE b.StatusId = 7

我试过了,但它并没有做我想做的事。

public Form GetFormWithNoTracking(int id)
{
    return ObjectSet
       .Where(x => x.FormId == id && 
                  (x.FormItem.Any(di => di.StatusId == (short)Status.Paid)))
       .AsNoTracking()
       .FirstOrDefault();
}

我尝试仅返回FormItemStatusId的{​​{1}}行。但是,以上全部归还。我知道Paid会检查是否有匹配以及是否全部返回,因此在这种情况下,对于此表单,我的数据确实包含.Any() StatusId的项目以及一些Paid未支付的项目,因此它会将所有项目全部收回。

2 个答案:

答案 0 :(得分:1)

var query = (from a in ObjectSet.FormA
             join b in ObjectSet.FormB on a.field equals b.field
             where b.StatusId = 7
             select new { a, b})

您可以使用相同的逻辑加入休息。

答案 1 :(得分:0)

这应该是你要求的:

  1. 使用Form
  2. 获取FormId = id
  3. 在该表单中,返回包含FormItems
  4. 的所有StatusId = Paid
    public IEnumerable<FormItem> GetFormWithNoTracking(int id)
    {
        return ObjectSet
            .SingleOrDefault(x => x.FormId == id)
            .Select(f => f.FormItem
                .Where(di => di.StatusId == (short)Status.Paid))
            .AsNoTracking();
    }
    

    如果您自己也需要Form,则可能需要创建自定义类型(编辑:请参阅@Burk的答案)或返回Tuple<Form,IEnumerable<FormItem>>IEnumerable<Tuple<Form,FormItem>>或任何适合您的类型最需要的是。

    或者,您可以删除表单中的所有非付费项目。

    public Form GetFormWithNoTracking(int id)
    {
        var form = ObjectSet
            .SingleOrDefault(x => x.FormId == id)
            .AsNoTracking();
    
        var nonPaid = form.Select(f => f.FormItem
                .Where(di => di.StatusId != (short)Status.Paid)).ToList();
    
        foreach(FormItem item in nonPaid)
            form.FormItem.Remove(item);
    
        return form;
    }
    
相关问题