使用linq c#如何使用条件选择两个不同的列表



以下是我的数据模型:

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有多个generatedAlerts

有两种情况:

  1. 是检索生成的警报的列表,其中read = true,如果属性ShowOldAlerts在alert被设置为false。
  2. 如果Alert中的ShowOldAlerts属性设置为true,则检索所有警报。但是我必须返回all this is one list。

我试过这样做,但它不工作:

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

也许你正在寻找这个

Filtere哪里

  • 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为真,ShowOldAlerts为假,则检索生成的警报。如果我对问题的理解正确的话,这应该可以工作。

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

最新更新