如何返回first或default

moiiocjp  于 2021-07-26  发布在  Java
关注(0)|答案(6)|浏览(333)

我有一个只想返回一条记录的方法,但我不能使用 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;
}

型号:

public class CorridoioWebResponse
{
    public string stab { get; set; }
    public string maga { get; set; }
    public string area { get; set; }
    public Int32 cors { get; set; }
}

它给我的错误是:
无法隐式地将类型“system.collections.generic.ienumerable<modelsome.model\u webinterface.mapatura.corridoiowebresponse>”转换为“modelsomemodel\u webinterface.mapatura.corridoiowebresponse”。

vq8itlhq

vq8itlhq1#

问题是 await cn.QueryAsync<CorridoioWebResponse>(strsql) 退货 IEnumerable<CorridoioWebResponse> 你想把它分配给 CorridoioWebResponse coridoio 和获取类型不匹配错误。
尝试以下操作: coridoio = _corridoio.FirstOrDefault(); (别忘了 using System.Linq )

z8dt9xmd

z8dt9xmd2#

使用这种代码字符串连接来生成查询和返回 IEnumerable<> 方法仅返回单个项时的结果。
现在,出现编译错误。即使它是固定的,当文本值被注入到查询中时,也会出现运行时错误。子字符串周围没有空格,因此整个where子句将无效: WHERE STAB=123AND MAGA =345AND CORS= 将代码替换为:

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});

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

eqqqjvef

eqqqjvef3#

我看到了错误:
modelsome.model\u webinterface是不同的modelsomemodel\u webinterface
你看,在s0me.model和\u corridoo之间,这是一个列表,我想
你应该用同样的型号。

nr9pn0ug

nr9pn0ug4#

似乎更像是sql问题而不是c问题。
试试这个:

SELECT Top 1 * from tmhit.CORRIDOI_CORSIE WHERE STAB=.....

编辑:
更改此项:

var _corridoio = await cn.QueryAsync<CorridoioWebResponse>(strsql);

对此:

var _corridoioList = await cn.QueryAsync<IEnumerable<CorridoioWebResponse>>(strsql);

    var _corridoio = _corridoioList.FirstOrDefault()
yftpprvb

yftpprvb5#

如果你不能使用 FirstOrDefault() 然后使用 ToList() :

var _corridoio = (await cn.QueryAsync<CorridoioWebResponse>(strsql)).ToList();
if (_corridoio.Count == 0)
    throw new ToyotaException("Non ci sono corridoi mappati");

coridoio = _corridoio[0];
b09cbbtk

b09cbbtk6#

await cn.QueryAsync<CorridoioWebResponse>(strsql) 总是返回 IEnumerable ,因为 QueryAsync 是与sql表相关的,想想看,sql表就像一个 IEnumerable 列表。
你的目标是( coridoio )类型应为 IEnumerable<CorridoioWebResponse> 然后你可以用 coridoio.FirstOrDefault() 把这个还给我。

相关问题