如何在LINQ中使用async和await?

90a*_*yss 4 c# linq asp.net-web-api

我是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);
    }
Run Code Online (Sandbox Code Playgroud)

我应该使用什么而不是FirstOrDefaultAsync?

Spr*_*ulx 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();
Run Code Online (Sandbox Code Playgroud)

https://msdn.microsoft.com/en-us/library/dn220257(v=vs.113).aspx

注意"新区域"来解决序列化的匿名类型问题(我无法评论Scott的答案).

UDPATE

因为您尝试部分加载模型(只有2个属性),所以需要使用如下的ViewModel:

public class RegionVM
{
    public int Region_ID { get; set; }
    public string Region_Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后更改您的代码:

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();
Run Code Online (Sandbox Code Playgroud)

不要忘记更新您的回复类型!

  • 如果您正在进行服务层,您可能会对带有OData v4的WEB API 2感兴趣.您可以在不使用DTO/VM作为json的情况下保护和返回部分模型.这取决于您是在制作网站还是数据服务. (2认同)
  • [这是一个教程](http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint)on Sproulx在谈论什么,我也会推荐这种方法. (2认同)