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

时间:2016-07-09 23:38:59

标签: c# entity-framework linq asp.net-web-api

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

我是Region类:

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_ID与region_IDs的多对多映射:

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

现在我想创建一个API函数,它根据给定的Service_ID输出Region_Name。这是我目前在RegionsController中的内容:

// 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_id。如何修改代码以解决此问题?是否有一个IN运算符可以用来表示r.Region_ID IN region_id?

上述代码看起来是否正确?

感谢。

1 个答案:

答案 0 :(得分:1)

您应该使用SingleOrDefaultAsync()方法更改Contains()来电,因为region_id属于IEnumerable<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));