簡體   English   中英

如何使用實體框架在 Linq 中模仿 SQL 外部應用?

[英]How do I mimic a SQL Outer Apply in Linq using Entity Framework?

我想使用 linq 模仿 SQL OUTER APPLY

我有 2 個表:Main 和 Sub

SQL 看起來像這樣:

select 
  M.Id, M.Number, M.Stuff, SD.SubName 
from 
  Main as M
outer apply (
  select top 1 SubName
  from Sub S
  where M.Id = S.Id and M.Number = S.Number
) as SD

基於這里和其他地方的答案,比如這個,我嘗試了太多的 Linq 迭代,但這里有一個:

var query1 = 
from m in dbContext.Main
join s in dbContext.Sub on new {m.Id, m.Number} equals new {s.Id, s.Number} into subs
select new
{
  m,
  SubName = subs.FirstOrDefault().SubName
}

這編譯得很好,但是當我運行它時,我得到了這個異常:

Processing of the LINQ expression 'DbSet<Main>
// EF's attempt to translate my query
'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.

和堆棧跟蹤。

有沒有人對如何正確編碼 go 有任何建議?

我正在針對 SQL Server 2017 運行 .NET 核心 3.1。

嘗試以下查詢。 EF Core 3.1,應將其轉換為 Outer Appply,但更高版本可能使用JOINROW_NUMBER

var query1 = 
    from m in dbContext.Main
    from s in dbContext.Sub
        .Where(s => m.Id == s.Id && m.Number == s.Number)
        .Take(1)
        .DefaultIfEmpty()
    select new
    {
        m,
        SubName = s.SubName
    }

或者這個變種:

var query1 = 
    from m in dbContext.Main
    select new
    {
        m,
        SubName = dbContext.Sub
            .Where(s => m.Id == s.Id && m.Number == s.Number)
            .Select(s => s.SubName)
            .FirstOrDefaut()
    }

暫無
暫無

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

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