linq/ef:如何形成连接多个表以返回结果的查询

本文关键字:返回 结果 查询 ef 连接 何形成 linq | 更新日期: 2023-09-27 17:56:06

我对ASP .NET和LINQ非常陌生,所以请原谅我的无知。

我有一个区域类:

public class Region
    {
        [Key]
        public int Region_ID { get; set; }
        public string Region_Name { get; set; }
    }

和服务类:

public class Service
    {
        [Key]
        public int Service_ID { get; set; }
        public string Service_Name { get; set; }
    }

还有一个映射类,它存储service_IDs的多对多映射,region_IDs:

public class Mapping_ServiceToRegion
    {
        [Key]
        public int Service_ID { get; set; }
        public int Region_ID { get; set; }
    }

现在我想创建一个 API 函数,该函数根据给定Service_ID输出Region_Name。这是我到目前为止在我的区域控制器中拥有的内容:

// GET api/Regions/Service_ID
    [ResponseType(typeof(Region))]
    public async Task<IHttpActionResult> GetRegion(int id)
    {
        var region_id = from sr in db.Mapping_ServiceToRegions
                           where sr.Service_ID == id
                           select sr.Region_ID;
        var region = await db.Regions.Select(r =>
            new Region()
            {
                Region_ID = r.Region_ID,
                Region_Name = r.Region_Name
            }).SingleOrDefaultAsync(r => r.Region_ID == region_id); //ERROR
        if (region == null)
        {
            return NotFound();
        }
        return Ok(region);
    }

我得到的错误是:

无法转换 lambda 表达式,因为它不是委托类型。

我意识到我的region_id变量将有多个基于service_id的region_ids。如何修改代码以解决此问题?是否有一个 IN 运算符可以用来表示r.Region_ID IN region_id?

否则上面的代码看起来是否正确?

谢谢。

linq/ef:如何形成连接多个表以返回结果的查询

您应该使用如下所示Contains()方法更改SingleOrDefaultAsync()调用,因为您的region_idIEnumerable<T>而不是单个值,因此您无法执行直接相等比较。

SingleOrDefaultAsync(r => region_id.Contains(r.Region_ID))

啊!!这里Region是EF映射实体之一,您正在尝试构造它,从而导致错误。您应该选择选择Anonymous类型(或)使用自定义视图模型/DTO对象,例如

    var region = await db.Regions.Select(r =>
        new
        {
            Region_ID = r.Region_ID,
            Region_Name = r.Region_Name
        }).SingleOrDefaultAsync(r => region_id.Contains(r.Region_ID));