【问题标题】:Turn SQL into Lambda/Linq将 SQL 转换为 Lambda/Linq
【发布时间】:2016-10-27 16:41:39
【问题描述】:

我一直在尝试将一段相当基本的 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();
}

我试图只返回来自FormItem 的行,其StatusIdPaid。但是,以上返回全部。我知道.Any() 将检查是否有任何匹配项以及是否有全部返回,所以在这种情况下,我的数据,对于这个表格,确实有具有PaidStatusId 的项目和一些具有@987654331 的项目@ 没有付款,所以它把它们都带回来了。

【问题讨论】:

  • 您正在尝试使用 linq lamda 执行内部连接,快速搜索会找到您需要的结果:stackoverflow.com/questions/2767709/…stackoverflow.com/questions/9720225/…
  • 现在这个函数应该返回第一个(如果有的话)Form,它有一个FormItemStatusIdPaid。由于您的返回类型是Form,因此我不完全确定您到底想要做什么。如果我正确理解您的问题,您只需要FormFormItemsFormId id 其中StatusIdPaid,...对吗?

标签: c# linq lambda


【解决方案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})

你可以用同样的逻辑加入 rest。

【讨论】:

    【解决方案2】:

    这应该是您要求的:

    1. 使用FormId = id 获取Form
    2. 在该表单中,返回所有具有StatusId = PaidFormItems
    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&lt;Form,IEnumerable&lt;FormItem&gt;&gt;IEnumerable&lt;Tuple&lt;Form,FormItem&gt;&gt; 或任何最适合您需求的类型。

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

    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;
    }
    

    【讨论】:

    • 替代解决方案对我很有帮助。感谢大家的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2021-05-30
    • 2020-10-23
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多