sql到linq“where-in”查询

zpgglvta  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(382)

我正在尝试将此sql查询转换为linq

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

此查询可以返回多行。
这是我尝试过的,但我不断得到这个错误
运算符“==”不能应用于“method group”和“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();

提前谢谢。

wj8zmpe1

wj8zmpe11#

这应该起作用:

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();
txu3uszq

txu3uszq2#

你有一张table吗 Fiches (fichepfes)和一张table EnseignantFiches (不知道怎么回事)。
两者之间似乎有某种联系 Fiches 以及 EnseignantFiches :每 Fiche 只有一个 EnseignantFiche, namely the 忽视 that the foreign key idfiche指的是。 此外,每个Fiche具有布尔属性Valid; 每EnseignantFiche具有(字符串?)属性IdEns. 要求:全部给我Validfiches,拥有一个值为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语句中这样做。因为查询尚未执行,所以这不会提高处理速度。它必然会降低可读性、可测试性和可重用性。

相关问题