我对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?
上述代码看起来是否正确?
感谢。
答案 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));