【问题标题】:Linq2DB and query for dynamicLinq2DB 和动态查询
【发布时间】:2019-02-05 08:23:00
【问题描述】:

我正在尝试在未创建映射它的模型的情况下执行查询。 考虑一下这个sn-p

public IDictionary<string, int> GetParentelaMapping()
    {
        using (var conn = dataContextFactory.Create())
        {
            var result = conn.Query<dynamic>("SELECT ID_GRADO_PARENTELA,GRADO_PARENTELA FROM GRADO_PARENTELA")
                .ToDictionary(
                    row => (string)row.GRADO_PARENTELA,
                    row => (int)row.ID_GRADO_PARENTELA, StringComparer.OrdinalIgnoreCase);

            return result;
        }
    }

它给了我一个例外 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“int”不包含“GRADO_PARENTELA”的定义

我该如何处理这种情况? 谢谢

【问题讨论】:

  • 目前不支持此类查询。您可以创建功能请求。最简单的解决方案是使用这些属性定义类并像这样使用它:db.FromSql&lt;YourClassHere&gt;(...sql..).ToDictionary(...)

标签: linq2db


【解决方案1】:

很遗憾,目前不支持此功能。为此跟踪新的issue #1591

作为一种解决方法,我建议定义额外的类来读取此类结果:

class ParentelaMapping
{
    public int ID_GRADO_PARENTELA { get; set; }
    pulbic string GRADO_PARENTELA { get; set; }
}

public IDictionary<string, int> GetParentelaMapping()
{
    using (var conn = dataContextFactory.Create())
    {
        var result = conn.Query<ParentelaMapping>("SELECT ID_GRADO_PARENTELA,GRADO_PARENTELA FROM GRADO_PARENTELA")
            .ToDictionary(
                row => row.GRADO_PARENTELA,
                row => row.ID_GRADO_PARENTELA, StringComparer.OrdinalIgnoreCase);

        return result;
    }
}

附:

linq2db 旨在更好地处理 linq 查询,因此请考虑以下列方式重写您的查询:

[Table("GRADO_PARENTELA")]
class GrandoParentela
{
    public int ID_GRADO_PARENTELA { get; set; }
    pulbic string GRADO_PARENTELA { get; set; }
}

public IDictionary<string, int> GetParentelaMapping()
{
    using (var conn = dataContextFactory.Create())
    {
        var result = conn.GetTable<GrandoParentela>()
            .ToDictionary(
                row => row.GRADO_PARENTELA,
                row => row.ID_GRADO_PARENTELA, StringComparer.OrdinalIgnoreCase);

        return result;
    }
}

【讨论】:

  • 感谢您的回复,您的意思是它更适合 linq 查询,它更快?
  • 这两种方法都非常快。生成的查询将被缓存并重用,因此下一次运行将只是执行查询。这里的好处是远离原始 SQL,这会在以后提供更好的代码支持。您也可以考虑使用查询分解和代码重用,这在使用字符串连接时并不那么明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多