我正在使用Entity Framework 5,我想从Oracle 10g数据库中选择数据。问题是数据库表很大,Entity Framework生成的查询无效。我想摆脱那些CAST( [column] AS [type] )。有什么设置可以关闭它们吗?
C#代码:
var context = new APPDB();
var q = context.APP_TABLE.Where(i => i.ID == 123);
// This is how I did get the generated SQL query
var str = ((System.Data.Objects.ObjectQuery) q ).ToTraceString();
Run Code Online (Sandbox Code Playgroud)
生成的查询:
SELECT
CAST( "Extent1"."ID" AS number(10,0)) AS "C1",
"Extent1"."DESCRIPTION" AS "DESCRIPTION"
FROM "APP"."APP_TABLE" "Extent1"
WHERE (123 = ( CAST( "Extent1"."ID" AS number(10,0))))
Run Code Online (Sandbox Code Playgroud)
我想要的是生成性能更好的查询的代码:
SELECT
"Extent1"."ID" AS "C1",
"Extent1"."DESCRIPTION" AS "DESCRIPTION"
FROM "APP"."APP_TABLE" …Run Code Online (Sandbox Code Playgroud) 我是否真的需要检查另一个表中的记录是否真的存在,如果PostgreSQL还是会检查外键约束?
Normaly parent在创建child记录之前检查是否存在记录.但这是另一个执行查询.所以我认为如果只处理PostgreSQL错误并检查是否parent存在记录不存在(违反外键约束)会更好.
是否更好地利用数据库服务器功能,或者它没有用于此目的?您是否建议在创建新记录之前进行所有完整性检查?
CREATE TABLE "public"."categories" (
"id" serial,
"name" varchar(100),
CONSTRAINT "categories__id_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "public"."products" (
"id" serial,
"category_id" integer NOT NULL,
"name" varchar(100),
CONSTRAINT "products__id_pkey" PRIMARY KEY ("id"),
CONSTRAINT "products__category_id_fkey" FOREIGN KEY ("category_id")
REFERENCES "categories" ("id") ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
伪代码:
if (query("SELECT * FROM categories WHERE id = 123"))
query("INSERT INTO products (category_id, name) VALUES (123, 'Something')")
else
throw Error("Parent record does not exist")
try
query("INSERT INTO …Run Code Online (Sandbox Code Playgroud)