【问题标题】:Sql to LINQ 'where in' querySql to LINQ“在哪里”查询
【发布时间】:2020-07-17 18:53:27
【问题描述】:

我正在尝试将此 SQL 查询转换为 LINQ

select * from fichepfe where valid = 1 and id_fiche in ( select fiche_id from enseignant_fiche where id_ens = '*variable*');

此查询可以返回多行。

这是我尝试过的,但我一直收到此错误

运算符“==”不能应用于“方法组”和“IQueryable”类型的操作数

我尝试了什么:

var fiches = (from fiche in _context.Fichepfes where fiche.Valid == true && fiche.IdFiche ==
              (from fens in _context.enseignant_fiche where IdEns == *variable*
              select fens.ficheId )
                  select fiche ).ToList();

提前致谢。

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    这应该可行:

    var fiches = 
        (from fiche in _context.Fichepfes where 
            fiche.Valid == true && 
            _context.enseignant_fiche.Any(fens => fens.IdEns == *variable* && fens.ficheId == fiche.IdFiche)
        ).ToList();
    

    但这可能会导致部分查询由客户端执行,因为 LINQ-to-SQL 可能无法将 .Any() 调用转换为原始查询。

    更好的方法是使用连接:

    var fiches =
        (from fens in _context.enseignant_fiche where fens.IdEns == ens
         join fiche in _context.Fichepfes on fens.ficheId equals fiche.IdFiche
         where fiche.Valid
         select fiche.IdFiche).ToList();
    

    也可以反过来进行连接,但在我的计算机上慢了大约 5 到 6 倍。

    var fiches =
        (from fiche in _context.Fichepfes where fiche.Valid
         join fens in _context.enseignant_fiche on fiche.IdFiche equals fens.ficheId
         where fens.IdEns == ens
         select fiche.IdFiche).ToList();
    

    【讨论】:

    • @HussamMejry 如果此答案解决了您的问题,请不要忘记单击左侧的绿色勾号将其标记为已接受的答案
    【解决方案2】:

    所以你有一个Fiches (FichePfes) 的表和一个EnseignantFiches (enseignant_fiche) 的表。

    FichesEnseignantFiches 之间似乎存在某种关系:每个Fiche 都有(拥有?)一个EnseignantFiche, namely the EnseignantFichethat the foreign keyIdFiche` 指代。

    此外,每个Fiche 都有一个布尔属性Valid;每个EnseignantFiche 都有一个(字符串?)属性IdEns

    要求:给我所有Valid Fiches,它拥有一个EnseignantFiche,其值为IdEns,等于“变量

    var validFiches = dbContext.Fiches.Where(fiche => fiche.Valid);
    var variableEnseignantFiches = dbContext.EnseignantFiches
        .Where(enseignantFiche => enseignantFiche.IdEns == "*variable*";
    
    var requestedFiches = validFiches.Join(
    variableEnseignantFiches,
    
    fiche => validFiche.IdFiche,                 // from every Fiche take the foreign key
    enseignantFiche => enseignantFiche.IdFiche,  // from every EnseignatFiche take primary key
    
    (fiche, enseignantFiche) => new              // when they match, make one new object
    {
        // Select the fiche properties that yo plan to use
        FicheId = fiche.Id,
        FicheName = fiche.Name,
        ...
    
        // Select the EnseignantFiche properties that you plan to use:
        EnseignantName = enseignantFiche.Name,
        ...
    });
    

    言辞:

    从 Fiches 表中,只保留有效的。
    从 EnseignantFiches 表中,仅保留 IdEns 等于“Variable”的那些
    将这两个表加入主键等于外键,并选择您计划使用的属性。

    当然,您可以在一个大的 LINQ 语句中做到这一点。由于查询尚未执行,因此不会提高处理速度。它肯定会降低可读性、可测试性和可重用性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多