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?
否则上面的代码看起来是否正确?
谢谢。
您应该使用如下所示Contains()
方法更改SingleOrDefaultAsync()
调用,因为您的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));