以下是我的数据模型:
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
有两种情况:
- 是检索生成的警报的列表,其中read = true,如果属性ShowOldAlerts在alert被设置为false。
- 如果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);