我是ASP.NET新手并且正在尝试处理示例项目。我知道这是一个愚蠢的问题,但请耐心等待。即使SQL查询中返回多行,下面的代码也只返回一个结果。我意识到FirstOrDefaultAsync只返回第一个元素。我在这里阅读文档:https://msdn.microsoft.com/en-us/library/system.data.entity.queryableextensions(v=vs.113).aspx但我找不到使用的内容而不是FirstOrDefaultAsync,它不仅会返回第一行,还会返回符合我的SQL条件的所有内容。
到目前为止,这是我的代码:
[ResponseType(typeof(Region))]
public async Task<IHttpActionResult> GetRegion(int id)
{
var region_id = from sr in db.ServiceToRegions
where sr.Service_ID == id
select sr.Region_ID;
var region = await db.Regions.Select(r =>
new
{
Region_ID = r.Region_ID,
Region_Name = r.Region_Name
}).FirstOrDefaultAsync(r => region_id.Contains(r.Region_ID)); //QQQ
if (region == null)
{
return NotFound();
}
return Ok(region);
}
我应该使用什么而不是FirstOrDefaultAsync?
答案 0 :(得分:6)
你应该在Where:
之后使用ToListAsync()var region = await db.Regions
.Select(r =>
new Region
{
Region_ID = r.Region_ID,
Region_Name = r.Region_Name
}
)
.Where(r => region_id.Contains(r.Region_ID))
.ToListAsync();
https://msdn.microsoft.com/en-us/library/dn220257(v=vs.113).aspx
注意&#34;新区域&#34;解决序列化的匿名类型问题(我无法评论Scott的答案)。
<强> UDPATE 强>
因为您尝试部分加载模型(只有2个属性),所以需要使用像这样的ViewModel:
public class RegionVM
{
public int Region_ID { get; set; }
public string Region_Name { get; set; }
}
然后更改您的代码:
var region = await db.Regions
.Select(r =>
new RegionVM
{
Region_ID = r.Region_ID,
Region_Name = r.Region_Name
}
)
.Where(r => region_id.Contains(r.Region_ID))
.ToListAsync();
不要忘记更新您的回复类型!
答案 1 :(得分:1)
您可以将FirstOrDefaultAsync
替换为Where
和ToListAsync()
var region = await db.Regions.Select(r =>
new
{
Region_ID = r.Region_ID,
Region_Name = r.Region_Name
}).Where(r => region_id.Contains(r.Region_ID)).ToListAsync();
这将返回List<someAnnonamousType>
。
答案 2 :(得分:0)
在这种情况下,您需要所有记录,您应该删除对FirstOrDefaultAsync()
的调用,该调用将返回IEnumerable<anonymoustype>
,如下所示。您可以使用Where()
LINQ扩展方法
var region = await db.Regions
.Select(r =>
new
{
Region_ID = r.Region_ID,
Region_Name = r.Region_Name
}).Where(r => region_id.Contains(r.Region_ID));