【问题标题】:PostgreSQL, Linq C# error 'could not determine data type of parameter $1'PostgreSQL,Linq C# 错误“无法确定参数 $1 的数据类型”
【发布时间】:2016-06-08 22:37:03
【问题描述】:

我收到此错误"could not determine data type of parameter $1" 我得到错误的 where 子句如下所示:

var result = from Table in model.Table 
                             where (filter.XId.HasValue ? Table.XId == filter.XId: true)

                             select new TableEntity
                             {
                                 ID = Table.XId
                             };

如果我的代码只是这样的“Table.X == filter.X”,它可以工作...... 我该如何解决这个问题?

我只在 PostgreSQL 数据库中遇到这个问题......

【问题讨论】:

  • 将该条件替换为“filter.X == Table.X || filter.X == null”
  • @Evk 我只想添加这个条件,如果进入方法的过滤器有一个值,我将过滤表值,如果我写了 Table.X == filter.X I如果 filter.X 为空,将会得到错误的值 ....
  • 这不是它的工作方式。实际上,您当前的语句将被转换为非常丑陋且长的 SQL 条件(您可以自己检查)。我提议的语句将获得完全相同的结果(如果 filter 为 null,它将被忽略)但语句不那么丑陋,并且(也许,没有检查)它也可以在 PostgreSQL 上正常工作。如果您不想包含条件 at all if filter 为 null - 检查它是否为 null before Where 语句,而不是在其中。
  • @Evk 如果我确实喜欢这个“filter.X == Table.X || filter.X == null”,如果我的过滤器这样做,我不会得到 x == null 的表值没有价值
  • 不,此条件与您的完全相同 - 如果 filter.X 为空 - 忽略条件(您的语句中的“:true”部分)。顺便说一句,postgre没有错误有帮助吗?

标签: c# linq postgresql


【解决方案1】:

首先关于该错误通常意味着什么。在对 PostgreSQL 进行参数化查询时,应在查询本身中引用所有参数。当你添加的参数多于查询中使用的参数时,通常会出现上述错误。

似乎当您使用的任何 PosgreSQL EF 提供程序将您的语句转换为 SQL 时,它创建的参数比需要的多。

一般来说,EF 提供程序可能很难像您使用的那样分析和正确解析语句,因此好的做法是使用在某种意义上“更接近”SQL 的语句。在您的情况下,“更接近”SQL 的等效查询将是:

where (filter.XId == null || Table.XId == filter.XId)

如果你想根据过滤器的值生成不同的查询,你可以这样做:

var query = (IQueryable<Table>) model.Table;
if (filter.XId != null) {
    query = query.Where(row => row.XId == filter.XId);
}
var result = query.Select(row => new TableEntity {
    Id = row.XId
});

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2021-11-28
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多