【问题标题】:Nested new result from entity framework query实体框架查询的嵌套新结果
【发布时间】:2013-03-14 23:44:28
【问题描述】:

我有一个按关键字和区域过滤“检查员”的功能。 “Inspectors”和“Areas”之间的关系是多对多的。

public IQueryable<Inspector> Search(string keywords, int? areaId)
{
    var qry = this.GetAllInspectors();

    if (!String.IsNullOrEmpty(keywords))
       qry = qry.Search(keywords);

    if (areaId.HasValue)
       qry = qry.ByAreaId(areaId.Value);

    var search = from a in _entities.Areas
                 select new InspectorSearchResult
                 {
                     Area = i.Areas,
                     Inspectors = (.....).ToList()
                  };  // ??

    return qry.OrderBy(i => i.LastName).ThenBy(i => i.FirstName);
}

InspectorSearchResult.cs

public class InspectorSearchResult
{
    public Area Area { get; set; }
    public List<Inspector> Inspectors { get; set; }
}

如何修改该查询,仅以嵌套形式获取“按区域检查员”?

更新:

试过这个但得到:“...方法不能被翻译成商店表达式。”

public List<InspectorSearchResult> Search(string keywords, int? areaId)
{
       var qry = this.GetAllInspectors();

       if (!String.IsNullOrEmpty(keywords))
          qry = qry.Search(keywords);

       if (areaId.HasValue)
          qry = qry.ByAreaId(areaId.Value);

       var search = from i in qry
                    from a in i.Areas
                    orderby a.AreaName
                    select new InspectorSearchResult
                     {
                         Area = a,
                         Inspectors = (from ins in a.Inspectors
                                       orderby ins.LastName, ins.FirstName
                                       select ins).ToList()
                     };

        return search.ToList();
 } 

【问题讨论】:

  • 你们的 POCO 长什么样?你的 Area 类中有导航属性public virtual ICollection&lt;Inspector&gt; Inspectors(或类似的东西)吗?
  • 它是 3.5,所以它没有 poco,但您可以使用 x.Area 和 x.Inspector 访问它

标签: c# linq entity-framework


【解决方案1】:

这是你想要达到的目标吗?

public List<InspectorSearchResult> Search(string keywords, int? areaId)
{
    var qry = this.GetAllInspectors();

    if (!String.IsNullOrEmpty(keywords))
        qry = qry.Search(keywords);

    if (areaId.HasValue)
        qry = qry.ByAreaId(areaId.Value);

    var search = from i in qry
        from a in i.Areas
        orderby a.AreaName
        select new InspectorSearchResult
        {
            Area = a
        };

    foreach(var x in search)
    {
        x.Inspectors = (
            from ins in a.Inspectors
            orderby ins.LastName, ins.FirstName
            select ins)
            .ToList();
    }

    return search.ToList();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多