如何在LINQ中使用async和await?

时间:2016-07-10 00:36:19

标签: 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);
    }

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

3 个答案:

答案 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替换为WhereToListAsync()

的组合
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));