簡體   English   中英

Linq中的SQL虛擬列

[英]SQL Virtual Column in Linq

有沒有一種方法可以使用Razor頁面和實體框架在C#dotnetcore MVC頁面中的linq查詢中創建與SQL虛擬/計算列相當的方法...

SELECT 0 as 'sortField'
FROM
    database
WHERE
    foo = bar

...但是使用方法語法,格式如下:

Foo = await
(
    _context.Foo
        .Where(r => !StatusExceptionList.Contains(r.Status))
        .Where(r => (Convert.ToDateTime(r.Statusdate) - today).TotalDays < 31)
        .Where(r => r.DSRPID == PID)
        .OrderBy(r => r.Submitteddate)
        .ThenBy(r => r.Statusdate)
        .ThenBy(r => r.recordnum)
)
.Union
(
_context.Foo
    .Where(r => !DraftStatusExceptionList.Contains(r.Status))
    .Where(r => r.DSRPID == PID)
    .Where(r => r.csstatus != "not needed" || !String.IsNullOrEmpty(r.csstatus))
    .Where(r => !_context.Foo
                .Where(rr => rr.DSRPID == PID)
                .Select(rr => rr.Fooid)
                .Contains(r.Fooid)
          )
     .OrderBy(r => r.Submitteddate)
     .ThenBy(r => r.Statusdate)
     .ThenBy(r => r.recordnum)
)
.ToListAsync();

我相信您可以這樣做:

class TableResults
{
  public int sortField
}

from t in context.Table select new TableResults { sortField = 0 }

因此,您必須擁有一個名為sortField的類。

您可以在linq中使用如下所示的匿名類型

from result in database
where foo = bar
select new { sortField=0 }

SQL虛擬/計算列的等效項將是readonly屬性。

如果實例將包含用於計算其值的所有必需值,則可以在您的實體類中執行此操作

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int SortValue => Id == 42 ? 0 : Id;
}

_context.Foo.Where(f => somecondition)
            .OrderBy(f => f.SortValue)
            .ToList();

如果實例沒有用於計算的所有必需值,則可以使用匿名類型

_context.Foo.Where(f => somecondition)
            .Select(f => new
            {
                Id = f.Id,
                Name = f.Name,
                SortValue = f.Name == "External name" ? 0 : 1
            })
            .OrderBy(f => f.SortValue)
            .ToList();

暫無
暫無

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

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