c# - PostgreSQL、Linq C# 错误 'could not determine data type of parameter $1'

标签 c# linq postgresql

我收到此错误 “无法确定参数 $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 数据库时遇到这个问题....

最佳答案

首先了解该错误通常意味着什么。对 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
});

关于c# - PostgreSQL、Linq C# 错误 'could not determine data type of parameter $1',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37701482/

相关文章:

c# - 如何获取没有子元素的元素?

c# - 使用具有多个条件和子查询的 LINQ 左连接

c# - EF6,延迟加载未按预期工作

postgresql - 我可以使用复制将数据添加到 Postgres 数组数据类型中吗

postgresql - socket.io 在浏览器刷新时重复发出事件

c# - 将 PostBackTrigger 和 AsyncPostBackTriggers 添加到 UpdatePanel 以使用 checkChanged EventHandler 动态生成复选框

c# - Thread.Sleep 的精度还很差吗?

c# - Webservice - 如何在日期时间元素中传递时区信息

c# - 抛出负数组大小的 OverflowException 背后的基本原理?

postgresql - 尝试使用 Diesel 插入值时出现 "expected struct String, found struct schema::my_table::columns::my_column"