如何返回 FirstOrDefault

kva*_*cka 0 c# sql sql-server generics ienumerable

我有我只想返回一条记录的方法,但我不能使用FirstOrDefault. 与数据库的连接工作正常,我已经尝试过了。

我想找到传递一些值的记录。

这是我尝试过的:

public async Task<CorridoioWebResponse> GetCorridoiWeb_ID(string stab, string maga, string area, Int32 cors)
{
    string strsql = string.Empty;
    string strErrore = string.Empty;
    string strConnessione = _configuration.GetConnectionString("ConnDB");
    SqlServerCompiler compiler = new SqlServerCompiler();
    CorridoioWebResponse coridoio;
    using (IDbConnection cn = new SqlConnection(strConnessione))
    {
        using (var db = new QueryFactory(cn, compiler))
        {
            strsql = "SELECT * from tmhit.CORRIDOI_CORSIE WHERE STAB=" + stab + "AND MAGA =" + maga + "AND AREA=" + area + "AND CORS=" + cors;
            //strsql = "SELECT top 1 STAB, MAGA, AREA, CORS from tmhit.CORRIDOI_CORSIE WHERE STAB=" + stab + "AND MAGA =" + maga + "AND AREA=" + area + "AND CORS=" + cors;
            //SELECT top 1 STAB, MAGA, AREA, CORS from tmhit.CORRIDOI_CORSIE WHERE STAB = 1 and MAGA = 0 and AREA = 0 and CORS = 9
            var _corridoio = await cn.QueryAsync<CorridoioWebResponse>(strsql);
            if (_corridoio.Count() == 0)
                throw new ToyotaException("Non ci sono corridoi mappati");

            coridoio = _corridoio;
        }
    }

    return coridoio;
}

Run Code Online (Sandbox Code Playgroud)

模型:

public class CorridoioWebResponse
{
    public string stab { get; set; }
    public string maga { get; set; }
    public string area { get; set; }
    public Int32 cors { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它给我的错误:

无法将类型“System.Collections.Generic.IEnumerable<ModelSOme.Model_WebInterface.Mapatura.CorridoioWebResponse>”隐式转换为“ModelSomeModel_WebInterface.Mapatura.CorridoioWebResponse”。

Pan*_*vos 5

此代码有两个问题 - 字符串连接以生成查询并IEnumerable<>在该方法仅返回单个项目时返回结果。

现在,您会收到编译错误。即使它被修复了,当文本值被注入到查询中,你也会得到运行时错误。子字符串周围没有空格,因此整个 WHERE 子句将无效:WHERE STAB=123AND MAGA =345AND CORS=abc

用这个替换代码:

var strsql = "SELECT TOP 1 * from tmhit.CORRIDOI_CORSIE WHERE STAB=@stab AND MAGA=@maga AND AREA=@area AND CORS=@cors";
var _corridoio = await connection.QuerySingleOrDefaultAsync<CorridoioWebResponse>(
                           strsql, 
                           new {stab,maga,area,cors});
Run Code Online (Sandbox Code Playgroud)

这将按名称传递参数值并返回第一个结果