具有过滤器的C#中的MongoDB Linq查询

莫妮卡

我正在尝试对几个Mongo集合进行LINQ查询。所有集合必须基于ApplicationId进行联接,并且必须进行外部联接-这样也将返回没有状态的人员。JOIN部分及其周围的所有内容均按预期工作。问题是,当我向其中一个集合添加过滤器时,整个过程就坏了

An exception of type 'System.ArgumentException' occurred in System.Linq.Expressions.dll but was not handled in user code: 'Expression of type 'System.Collections.Generic.IEnumerable`1[CDM.Person]' cannot be used for parameter of type 'System.Linq.IQueryable`1[CDM.Person]' of method 'System.Linq.IQueryable`1[CDM.Person] Where[Person](System.Linq.IQueryable`1[CDM.Person], System.Linq.Expressions.Expression`1[System.Func`2[CDM.Person,System.Boolean]])''

这是我的查询

var applications = _dbContext.GetCollection<Application>(typeof(Application).Name).AsQueryable().Where(
                x => x.OrganizationID == TokenContext.OrganizationID);

var persons = _dbContext.GetCollection<Person>(typeof(Person).Name).AsQueryable().Where(p =>p.FirstName == "j");
var statuses = _dbContext.GetCollection<ApplicationStatus>(typeof(ApplicationStatus).Name).AsQueryable();
var mortgages = _dbContext.GetCollection<Mortgage>(typeof(Mortgage).Name).AsQueryable();

            var statusQuery = from a in applications
                                join p in persons on a.ApplicationID equals p.ApplicationID 
                                join s in statuses on a.ApplicationID equals s.ApplicationID into pas
                                join m in mortgages on a.ApplicationID equals m.ApplicationID into morgs
                                from subWHatever in pas.DefaultIfEmpty()
                              select new ApplicationStatusProjection
                              {
                                  ApplicationId = a.ApplicationID,
                                  FirstName = p.FirstName,
                                  LastName = p.Surname,
                                  Prefix = p.Prefix,
                                  DateOfBirth = p.DateOfBirth,
                                  Initials = p.Initials,
                                  PostalCode = p.Addresses.First().PostalCode,
                                  MortgageAmount = morgs.Sum(i => i.MortgageTotal) ?? 0,
                                  StatusExpireAt = subWHatever.ExpireAt ?? DateTime.MinValue,
                                  StatusMessageText = subWHatever.MessageText ?? "",
                                  StatusMessage = subWHatever.MessageStatus ?? ""

                              };

            if (!String.IsNullOrEmpty(orderBy))
            {
                statusQuery = statusQuery?.OrderBy(orderBy);
            }

            if (nrOfRecords != null)
            {
                statusQuery = statusQuery?.Take(nrOfRecords.Value);
            }

            // Execute the query
            var result = statusQuery?.ToList();
            return result;

我在这里遵循了指南https://mongodb.github.io/mongo-csharp-driver/2.6/reference/driver/crud/linq/,我也尝试过

var statusQuery = 
    from a in applications
       join p in persons on a.ApplicationID equals p.ApplicationID into pa
    from paObject in pa.DefaultIfEmpty()
       join s in statuses on paObject.ApplicationID equals s.ApplicationID into pas

但是我得到了和以前一样的错误。

先感谢您。

莫妮卡

因此,在进行可能的试用之后,我发现由于LINQ查询被转换为Mongo查询的方式,您无法在连接之前进行过滤。解决此问题的方法是,之后对statusQuery对象进行过滤。在这种情况下,必须在投影对象上进行过滤(因此需要一个新的过滤器)。请参阅下面我如何解决它:

 //get collections
            var applications = _dbContext.GetCollection<Application>(typeof(Application).Name).AsQueryable().Where(
                x => x.OrganizationID == TokenContext.OrganizationID);
            var persons = _dbContext.GetCollection<Person>(typeof(Person).Name).AsQueryable();
            var statuses = _dbContext.GetCollection<ApplicationStatus>(typeof(ApplicationStatus).Name).AsQueryable();
            var mortgages = _dbContext.GetCollection<Mortgage>(typeof(Mortgage).Name).AsQueryable();

            //query
            var query = from a in applications
                              join p in persons on a.ApplicationID equals p.ApplicationID
                              join s in statuses on a.ApplicationID equals s.ApplicationID into applicationStatusView
                              join m in mortgages on a.ApplicationID equals m.ApplicationID into morgs
                              from subStatus in applicationStatusView.DefaultIfEmpty()
                              select new ApplicationStatusProjection
                              {
                                  ApplicationId = a.ApplicationID,
                                  FirstName = p.FirstName,
                                  LastName = p.Surname,
                                  Prefix = p.Prefix,
                                  DateOfBirth = p.DateOfBirth,
                                  Initials = p.Initials,
                                  Addresses = p.Addresses ?? new List<Address>(),
                                  PostalCode = p.Addresses.First().PostalCode,
                                  MortgageAmount = morgs.Sum(i => i.MortgageTotal) ?? 0,
                                  StatusExpireAt = subStatus.ExpireAt ?? DateTime.MinValue,
                                  StatusMessageText = subStatus.MessageText ?? "",
                                  StatusMessage = subStatus.MessageStatus ?? "",
                                  StatusDate = subStatus.StatusDate

                              };

            //filter & order
            var filteredResult = ApplyFilters(query, searchCriteria);

            if (!String.IsNullOrEmpty(orderBy))
            {
                filteredResult = filteredResult?.OrderBy(orderBy);
            }

            if (nrOfRecords != null)
            {
                filteredResult = filteredResult?.Take(nrOfRecords.Value);
            }

            // Execute the query
            var result = filteredResult?.ToList();
            return result;

并应用过滤器(执行此操作可能是更聪明的方法):

 private IQueryable<ApplicationStatusProjection> ApplyFilters(IQueryable<ApplicationStatusProjection> query, ApplicationStatusProjectionSearch searchCriteria)
        {
            if (!string.IsNullOrEmpty(searchCriteria.FirstName))
            {
                query = query.Where(x => x.FirstName.ToLower().StartsWith(searchCriteria.FirstName));
            }

            if (!string.IsNullOrEmpty(searchCriteria.LastName))
            {
                query = query.Where(x => x.LastName.ToLower().StartsWith(searchCriteria.LastName));
            }

            if (!string.IsNullOrEmpty(searchCriteria.PostalCode))
            {
                query = query.Where(x => x.Addresses.Any(a => a.PostalCode.ToLower().StartsWith(searchCriteria.PostalCode)));
            }
//other irrelevant filters
            return query;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有Linq全文搜索查询的C#列表框过滤器

来自分类Dev

如何使用@>运算符构建具有过滤器的sqlalchemy查询?

来自分类Dev

雄辩的带有过滤器的复杂查询

来自分类Dev

Swift中带有过滤器的高级Firebase查询

来自分类Dev

如何在Django中编写查询以连接三个具有过滤器和按条件排序的表

来自分类Dev

仅针对具有过滤器的排序查询结果聚合脚本,而不是完整数据集

来自分类Dev

C#linq查询过滤器子集合

来自分类Dev

返回页面时,带有过滤器搜索页面的Flutter不断从查询中添加相同的列表视图

来自分类Dev

基于过滤器重新查询linq查询

来自分类Dev

SQL查询返回匹配任何或所有过滤器但不超过过滤器的行

来自分类Dev

在LINQ C#中深入过滤查询

来自分类Dev

MongoDB-linq中包含不受支持的过滤器。如何在Linq查询中使用contains和ToLower?

来自分类Dev

MongoDB查询过滤器

来自分类Dev

带有过滤器的ElasticSearch function_score查询

来自分类Dev

带有过滤器的AppEngine数据存储区查询从不返回结果(Go)

来自分类Dev

通过ForeignKey外部引用对带有过滤器的子查询进行了汇总

来自分类Dev

PHP Elasticsearch,带有过滤器的布尔查询未获得任何结果

来自分类Dev

弹性搜索 更像这个带有过滤器的查询是添加结果

来自分类Dev

连接Linq查询中的Linq查询结果

来自分类Dev

如何过滤linq查询

来自分类Dev

通过C#中的动态过滤器查询过滤复杂的JSON

来自分类Dev

具有Distinct过滤器的Entity Framework 6查询

来自分类Dev

尝试查询具有多个过滤器的表

来自分类Dev

具有Distinct过滤器的Entity Framework 6查询

来自分类Dev

具有排序查询建模的 Cassandra 过滤器

来自分类Dev

在过滤器中具有大(?)IN列表的Postgresql 10查询

来自分类Dev

搜索过滤器中具有通配符模式的嵌套组的 Active Directory 搜索查询

来自分类Dev

使用c#在mongo查询中过滤器是否可替换查询?

来自分类Dev

Kendo HTML网格过滤器到linq查询

Related 相关文章

  1. 1

    具有Linq全文搜索查询的C#列表框过滤器

  2. 2

    如何使用@>运算符构建具有过滤器的sqlalchemy查询?

  3. 3

    雄辩的带有过滤器的复杂查询

  4. 4

    Swift中带有过滤器的高级Firebase查询

  5. 5

    如何在Django中编写查询以连接三个具有过滤器和按条件排序的表

  6. 6

    仅针对具有过滤器的排序查询结果聚合脚本,而不是完整数据集

  7. 7

    C#linq查询过滤器子集合

  8. 8

    返回页面时,带有过滤器搜索页面的Flutter不断从查询中添加相同的列表视图

  9. 9

    基于过滤器重新查询linq查询

  10. 10

    SQL查询返回匹配任何或所有过滤器但不超过过滤器的行

  11. 11

    在LINQ C#中深入过滤查询

  12. 12

    MongoDB-linq中包含不受支持的过滤器。如何在Linq查询中使用contains和ToLower?

  13. 13

    MongoDB查询过滤器

  14. 14

    带有过滤器的ElasticSearch function_score查询

  15. 15

    带有过滤器的AppEngine数据存储区查询从不返回结果(Go)

  16. 16

    通过ForeignKey外部引用对带有过滤器的子查询进行了汇总

  17. 17

    PHP Elasticsearch,带有过滤器的布尔查询未获得任何结果

  18. 18

    弹性搜索 更像这个带有过滤器的查询是添加结果

  19. 19

    连接Linq查询中的Linq查询结果

  20. 20

    如何过滤linq查询

  21. 21

    通过C#中的动态过滤器查询过滤复杂的JSON

  22. 22

    具有Distinct过滤器的Entity Framework 6查询

  23. 23

    尝试查询具有多个过滤器的表

  24. 24

    具有Distinct过滤器的Entity Framework 6查询

  25. 25

    具有排序查询建模的 Cassandra 过滤器

  26. 26

    在过滤器中具有大(?)IN列表的Postgresql 10查询

  27. 27

    搜索过滤器中具有通配符模式的嵌套组的 Active Directory 搜索查询

  28. 28

    使用c#在mongo查询中过滤器是否可替换查询?

  29. 29

    Kendo HTML网格过滤器到linq查询

热门标签

归档