.NETCORE C# - LINQ查询运算符可以通过逻辑分开



我有六个LINQ queries。每个查询都包含上一个查询使用的操作员,并在链条中添加了另一个操作员:

Foo = await
(
    _context.Foo
        .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31)
 )
 .ToListAsync(); 
Foo = await
(
    _context.Foo
        .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31)
        .Where(f => f.recordid == x)
 )
 .ToListAsync(); 
Foo = await
(
    _context.Foo
        .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31)
        .Where(f => f.recordid == x)
        .Where(f => !StatusExceptionList.Contains(r.Status))
 )
 .ToListAsync(); 
Foo = await
(
    _context.Foo
        .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31)
        .Where(f => f.recordid == x)
        .Where(f => !StatusExceptionList.Contains(r.Status))
        .OrderBy(f => f.date1)
 )
 .ToListAsync(); 
Foo = await
(
    _context.Foo
        .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31)
        .Where(f => f.recordid == x)
        .Where(f => !StatusExceptionList.Contains(r.Status))
        .OrderBy(f => f.date1)
        .ThenBy(f => f.date2)
)
.ToListAsync(); 
Foo = await
(
    _context.Foo
        .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31)
        .Where(f => f.recordid == x)
        .Where(f => !StatusExceptionList.Contains(r.Status))
        .OrderBy(f => f.date1)
        .ThenBy(f => f.date2)
        .ThenBy(f => f.recordid)
)
.ToListAsync(); 

我想将其压缩到一个查询,并在不同的LINQ运算符之间编织逻辑,如该伪代码所示,这根本不起作用。我四处搜索,不确定接下来要做什么:

Foo = await
(
    _context.Foo
        .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31)
        if (some logic)
        {
            .Where(f => f.recordid == x)
        }
        if (some different logic)
        {           
            .Where(f => !StatusExceptionList.Contains(r.Status))
        }
        if (some different logic)
        {
            .OrderBy(f => f.date1)
        }
        if (some different logic)
        {
            .ThenBy(f => f.date2)
        }
        if (some different logic)
        {
            .ThenBy(f => f.recordid)
        }
)
.ToListAsync(); 

有人可以将我指向正确的方向或告诉我我是否想以错误的方式解决这个问题?谢谢一堆!

只是将查询存储在单独的变量中:

IQueryable<Foo> query = _context.Foo
    .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31);

然后附加您的支票:

if (someCondition) {
    query = query.Where(f.recordid == x);
}

等等。最后 - 运行查询:

Foo = await query.ToListAsync();

使用OrderByThenBy-检查查询是否已经是IOrderedQueryable

if (someCondition) {
    var ordered = query as IOrderedQueryable<Foo>;
    if (ordered != null)
        query = ordered.ThenBy(x => x.field);
    else 
        query = query.OrderBy(x => x.field);
}

您可以构造查询,然后等待其结果:

IQueryable<Foo> query = _context.Foo
    .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31);
if (some logic) {
    query = query.Where(f => f.recordid == x);
}
if (some different logic) { 
    query = query.Where(f => !StatusExceptionList.Contains(r.Status));
}
if (some ordering logic 1) {
    query = query.OrderBy(f => f.date1);
}
if (some ordering logic 2) {
    query = ((IOrderedQueryable<Foo>)query).ThenBy(f => f.date2);
}
if (some ordering logic 3) {
    query = ((IOrderedQueryable<Foo>)query).ThenBy(f => f.recordid);
}

重要的是,"某些订购逻辑1"比"某些订购逻辑2"one_answers"一些订购逻辑3"要弱,否则演员将不会成功。

另一种方法是使单个Where条件:

Foo = await
(
    _context.Foo
        .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31
        && (conditionFor2 && f.recordid == x)
        && (conditionFor3 && !StatusExceptionList.Contains(r.Status))
).ToListAsync(); 

您可以分配一个变量:

var query = _context.Foo
    .Where(f => (Convert.ToDateTime(f.date1) - today).TotalDays < 31);
if (something)
{
    query = query.Where(f => !StatusExceptionList.Contains(r.Status));
}

等等。

最终:

var result = await query.ToListAsync();

相关内容

最新更新