[英]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) 表。
Fiches
和EnseignantFiches
之間似乎存在一種關系:每個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.