c# - 如何在 LINQ 中使用异步和等待?

标签 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?

最佳答案

您应该在 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

注意“新区域”以解决您的序列化匿名类型问题(我无法评论斯科特的回答)。

更新

因为您尝试部分加载模型(只有 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();

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

关于c# - 如何在 LINQ 中使用异步和等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38287545/

相关文章:

c# - WPF C# LINQ : Operator '&&' cannot be applied to operands of type 'string' and 'string' query

c# - 在 Application_AquireRequestState 事件中用 POST 数据重写 Url

c# - 在 .net 环境中使用 Mapnik

C# 创建具有动态属性的对象 : LINQ select List<object> values by property names array

c# - 是否有结构继承的实用替代方案? (C#)

c# - 对具有各种数据类型的委托(delegate)进行排序

c# - Uri ToString() 方法解码 Uri 查询

c# - 使用 MultipartFormDataStreamProvider 和 ReadAsMultipartAsync

c# - 发送包含 html 的 smtp 邮件到 gmail 帐户

C# Lambda 表达式 - 从字符串获取属性值