如何使用 linq 从父类和嵌套数组子类中获取值?

Posted

技术标签:

【中文标题】如何使用 linq 从父类和嵌套数组子类中获取值?【英文标题】:How to get value from a parent class and a nested array child using linq? 【发布时间】:2021-12-18 01:03:51 【问题描述】:

我有以下模型从数据库中获取数据:

    public class CultureResource
    
        public string KeyName  get; set; 
        public List<Resource> Resources  get; set; 
    

    public class Resource
    
        public string Value  get; set; 
        public string Culture  get; set; 
    

现在我的目标是获取keysculture 列表的数据,其中keysCultureResource.KeyName 匹配,cultureResource.Culture 匹配。如何在 IQueryable&lt;CultureResource&gt; 上编写 linq 查询以获得 IList&lt;Result&gt; 的结果,其中 Result 可能如下所示:

public class Result

    public string KeyName get; set;
    public string Value get; set;

我尝试了以下 Linq,但它会抛出 $project or $group does not support document. 错误:

public IDictionary<string, string> GetLocalizedValueList(string[] keys, string culture)

    // returns IQueryable<CultureResource>
    var cultureResources = _repository.GetItems<CultureResource>();     

    /***** This is the query *********/
    var query = from cr in cultureResources
              from r in cr.Resources
              where keys.Contains(cr.KeyName) && r.Culture == culture
              select new  cr.KeyName, r.Value ;
              
    var result = query.ToList()
              
    //return some data

仅供参考:我的底层数据库是 mongo

【问题讨论】:

【参考方案1】:

这个怎么样

        var query = cultureResources.SelectMany(cultureResource => cultureResource.Resources.Select(resource => new  cultureResource.KeyName, resource.Value )).ToList();

【讨论】:

这个不检查文化或键 好的,可以试试这个var query = cultureResources.Where(cultureResource =&gt; keys.Contains(cultureResource.KeyName)) .SelectMany(cultureResource =&gt; cultureResource.Resources.Where(resource=&gt;resource.Culture==culture) .Select(resource =&gt; new cultureResource.KeyName, resource.Value )).ToList();

以上是关于如何使用 linq 从父类和嵌套数组子类中获取值?的主要内容,如果未能解决你的问题,请参考以下文章

如何从父类和子类的相同方法返回泛型类型

使用 OnetoMany 关系从父类更新子类实体

父类和子类可以相互转化吗?

Java中的继承和多态

Delphi的类和对象- 继承

使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值