构建Linq查询并基于表动态连接

时间:2017-11-16 16:16:27

标签: c# linq asp.net-mvc-5

我正在总结数据以构建警报系统。此查询根据某些条件计算员工的点数。下面这个工作正常。但是,查询可能会更长,具体取决于用户的位置。例如,下面我只有3个工会,但对于其他员工的位置,可能需要更多的工会。例如,在位置B中,如果ReasonTypeID ==为3且过去90天内的任何条目,他们可能还想添加警报。

所以我正在考虑构建一个表,我可以逐个位置地添加参数。我已经阅读了关于动态linq库的内容,我可以将它用于WHERE语句,但是如何在运行中添加另一个查询串联?

这是我现在拥有的。

public class TMAlert
{
    public string EmpID { get; set; }
    public string FullName { get; set; }
    public decimal? PointSummary { get; set; }
    public string WarningLabel { get; set; }
    public bool AlertFlag { get; set; }
}

IEnumerable<TMAlert> tmAlert = (
    from a in allEntries
    where a.Date >= DateTime.Now.AddDays(-30) && a.ReasonTypeID == 1
    group a by new
    {
        a.EmpID,
        a.FullName,
        a.ReasonTypeID
    } into g
    select new TMAlert
    {
        EmpID = g.Key.EmpID,
        FullName = g.Key.FullName,
        WarningLabel = "Last 30 Days",
        PointSummary = g.Sum(a => a.Points),
        AlertFlag = (g.Sum(a => a.Points) >= 4) ? true : false
    }).Concat(from a in allEntries
              where a.Date >= DateTime.Now.AddDays(-90) && a.ReasonTypeID == 1
              group a by new
              {
                  a.EmpID,
                  a.FullName,
                  a.ReasonTypeID
              } into g
              select new TMAlert
              {
                  EmpID = g.Key.EmpID,
                  FullName = g.Key.FullName,
                  WarningLabel = "Last 90 Days",
                  PointSummary = g.Sum(a => a.Points),
                  AlertFlag = (g.Sum(a => a.Points) >= 9) ? true : false
              }).Concat(from a in allEntries
                        where a.Date >= (
                        from o in allEntries
                        where o.EmpID == a.EmpID && a.WarningTypeID == 2
                        select (DateTime?)o.Date).Max()
                        group a by new
                        {
                            a.EmpID,
                            a.FullName,
                            a.ReasonTypeID
                        } into g
                        select new TMAlert
                        {
                            EmpID = g.Key.EmpID,
                            FullName = g.Key.FullName,
                            WarningLabel = "60 Since Warning type 2 ",
                            PointSummary = g.Sum(a => a.Points),
                            AlertFlag = (g.Sum(a => a.Points) >= 4) ? true : false
                        });

我正在考虑构建一个条件表,然后根据表格动态构建查询。 例如

for each entry in criteriaTable

add dynamic linq entry.Param
.concat(....

next....

这是可能的还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

有一种方法可以动态组合linq查询。我在显示过滤的数据列表时使用它来向where语句添加条件过滤器。

我像这样初始化lambda表达式

Expression<Func<CatalogItem, bool>> Filter = CatalogItem => true;

然后当我离开时,我加入它。

if(!string.IsNullOrEmpty(searchVal)) {Filter = Filter.Compose(CatalogItem => CatalogItem.Title.ToLower().Contains(searchVal), Expression.And);}

我可能有不同的if条件导致我向我的过滤器添加越来越多的内容然后最后我想对我的集合应用该过滤器。

IQueryable<CatalogItem> FilteredList = Items.AsQueryable().Where(Filter);

在这种情况下,Items是先前从数据库中提取的CatalogItem列表。我正在使用IQueryable而不仅仅是List&lt;&gt;因为我之后需要对结果采取行动。

List<CatalogItem> Items;//fill Items list here;

我知道这是在线Linq而不是你使用的结构但是我真的无法进入另一种形式的linq查询,因为这对我来说是如此的快速和肮脏。如果您必须使用其他linq表单,则这些规则可能仍适用。