簡體   English   中英

使用 linq c# 我怎么能 select 使用一個條件兩個不同的列表

[英]Using linq c# how can I select using a condition two different lists

這是我的數據模型:

public class GeneratedAlertDataModel : BaseEntity
{
    /// <summary>
    /// the alert that will be generated 
    /// from configuration of alert
    /// </summary>
    public string AlertText { get; set; }
    public bool Read { get; set; }
    public AlertDataModel Alert { get; set; }
    public DateTime ReceivedDate { get; set; }
    public bool Completed { get; set; }
}

public class AlertDataModel : BaseEntity
{
    [Required]
    [MaxLength(250)]
    public string Designation { get; set; }

    [Required]
    public PriorityLevel PriorityLevel { get; set; }

    public bool ShowOldAlerts { get; set; }
}

兩個表之間的關系是多對一的,一個Alert有多個生成的Alerts。

我有兩種情況:

  1. 如果警報中的屬性 ShowOldAlerts 設置為 false,則檢索生成的警報列表,其中 read = true。
  2. 如果 Alert 中的屬性 ShowOldAlerts 設置為 true,則檢索所有警報。 但我必須返回所有這些都是一個列表。

我試過這樣做,但它不起作用:

        var generatedAlertDbQuery = _context.GeneratedAlerts.Include(a => a.Alert)
            // if set ShowAlert to false, get only the not viewed generated alerts
            .Where(a => a.Alert.ShowOldAlerts).Select(a => a)
            // if set ShowAlert to true, get only the not viewed generated alerts
            .Where(a => !a.Alert.ShowOldAlerts).Select(a => a).Where(a => !a.Read)

            .OrderBy(a => a.ReceivedDate) // Ordered by the receive date
            .Take(take) // Taking maximum (will be configured in client)
            .AsQueryable();

        var generatedAlertResponse = await generatedAlertDbQuery.Select(a => new GeneratedAlertResponse
        {
            Id = a.Id,
            Alert = _mapper.Map<AlertInfoResponse>(a.Alert),
            ReceivedDate = a.ReceivedDate,
            Completed = a.Completed,
        }).ToListAsync();

也許你正在尋找這個。

在哪里過濾

  • x.Alert.ShowOldAlerts == true

    或者

  • x.Alert.ShowOldAlerts == false && Read == false

例子

var results = _context.GeneratedAlerts
    .Include(a => a.Alert)
    .Where(x => x.Alert.ShowOldAlerts || !x.Read)
    .Select(a => new GeneratedAlertResponse
    {
        Id = a.Id,
        Alert = _mapper.Map<AlertInfoResponse>(a.Alert),
        ReceivedDate = a.ReceivedDate,
        Completed = a.Completed
        ...
    }.ToList();

如果您需要分離結果,最好仍然保留一個查詢(到數據庫的一次往返),但是您可以在事后過濾結果。

var alerts = results.Where(x => x.Alert.ShowOldAlerts);

var read = results.Axcept(alerts ); 

對於第一種情況,如果Read為 true 且ShowOldAlerts為 false,則檢索生成的警報。 如果我正確理解了這個問題,這應該有效。

var alerts = _context.GeneratedAlerts
    .Where(c => c.Read && !c.Alert.ShowOldAlerts);

對於第二種情況,僅當ShowOldAlerts為 false 時才檢索生成的警報。

var alerts = _context.GeneratedAlerts
         .Where(c => c.Alert.ShowOldAlerts);

作為一個列表返回,條件似乎很尷尬,但在這里

var alerts = _context.GeneratedAlerts
    .Where(c => (c.Read && !c.Alert.ShowOldAlerts) || c.Alert.ShowOldAlerts);

暫無
暫無

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

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