【问题标题】:How to return FirstOrDefaultAsync EF Linq to entity List query如何将 FirstOrDefaultAsync EF Linq 返回到实体列表查询
【发布时间】:2021-11-08 15:05:38
【问题描述】:

我有这个 Linq to entity 查询,它返回一个包含连接的访问​​者列表。
我想要一个类似的查询来返回单个记录,而查询不是列表集合,但是使用FirstOrDefaultAsync 将其更改为基本选择会得到错误"A query body must end with a select clause or a group clause"

public async Task<List<VisitorDetail>> GetOneVisitor(int visitorId)
{
    var query = await (from v in _context.Visitors
        where v.Id == visitorId
        join d in _context.Categories on v.VisitCategoryId equals d.Id
        join c in _context.Counters on v.AssignedCounter equals c.Host into counterGroup
        from cg in counterGroup.DefaultIfEmpty()
        select new
        {
            FirstName = v.FirstName,
            LastName = v.LastName,
            CounterDescription = cg.Description,
            VisitCategory = d.Description
        }).ToListAsync();

    List<VisitorDetail> visitors = new();

    foreach (var p in query)
    {
        visitors.Add(new VisitorDetail
        {
            FirstName = p.FirstName,
            LastName = p.LastName,
            CounterDescription = p.CounterDescription,
            CategoryDescription = p.VisitCategory
        });
    }
    return visitors;
}

【问题讨论】:

    标签: linq entity-framework-6


    【解决方案1】:

    如果您想通过 LINQ to Entities 保持 DRY,请为您的常见查询返回 IQueryable,并仅在需要时调用具体化。

    您的方法可以通过以下方式重写:

    public IQueryable<VisitorDetail> GetVisitorDetails(int visitorId)
    {
        var query = 
            from v in _context.Visitors
            where v.Id == visitorId
            join d in _context.Categories on v.VisitCategoryId equals d.Id
            join c in _context.Counters on v.AssignedCounter equals c.Host into counterGroup
            from cg in counterGroup.DefaultIfEmpty()
            select new VisitorDetail
            {
                FirstName = v.FirstName,
                LastName = v.LastName,
                CounterDescription = cg.Description,
                CategoryDescription = d.Description
            };
    
        return query;
    }
    
    var many = await GetVisitorDetails(visitorId).ToListAsync();
    var one  = await GetVisitorDetails(visitorId).FirstOrDefaultAsync();
    

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 2023-03-11
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      相关资源
      最近更新 更多