簡體   English   中英

Sql 到 LINQ 'where in' 查詢

[英]Sql to LINQ 'where in' query

我正在嘗試將此 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();

提前致謝。

這應該有效:

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

因此,您有一張Fiches (FichePfes) 表和一張EnseignantFiches (enseignant_fiche) 表。

FichesEnseignantFiches之間似乎存在一種關系:每個Fiche都有(擁有?)恰好一個EnseignantFiche, namely the that the foreign key IdFiche 所指的 EnseignantFiche。

此外,每個Fiche都有一個 Boolean 屬性Valid 每個EnseignantFiche都有一個(字符串?)屬性IdEns

要求:給我所有Valid Fiches,它擁有一個 IdEns 值等於“變量”的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 ”的那些
在 Primary key equals Foreign key 和 Select 上加入您計划使用的屬性這兩個表。

當然,您可以在一個大的 LINQ 語句中執行此操作。 因為查詢還沒有執行,所以這不會提高處理速度。 它肯定會降低可讀性、可測試性和可重用性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM