小编Moo*_*ozz的帖子

实体框架Linq中的奇怪行为在字符串EndsWith方法中

背景

我有一个只包含一列的表:名称.比方说,它只有四行

| Name      |
| test1.com |
| test2.com |
| test3.com |
| test4.com |
Run Code Online (Sandbox Code Playgroud)

问题

如果我查询

var email = "a@test2.com";
Table.Where(x => email.EndsWith(x.Name));
Run Code Online (Sandbox Code Playgroud)

我会得到一个空列表.但如果我先查询所有行并计算内存中的这样

var email = "a@test2.com";
Table.ToList().Where(x => email.EndsWith(x.Name));
Run Code Online (Sandbox Code Playgroud)

我会得到一个只包含test2.com的列表,这是正确的.

为第一个查询生成的SQL是

SELECT "Extent1"."Name" AS "Name"
FROM "USER"."Table" "Extent1"
WHERE (( NVL(INSTR(REVERSE(:p__linq__0), REVERSE("Extent1"."Name")), 0) ) = 1)
Run Code Online (Sandbox Code Playgroud)

我尝试用'a@test2.com'替换:p__linq__0并在SQLDeveloper中运行查询,结果是正确的.

更多信息

如果我将EndsWith()更改为Contains(),问题就会消失.这是为Contains()生成的SQL

SELECT "Extent1"."Name" AS "Name"
FROM "USER"."Table" "Extent1"
WHERE (( NVL(INSTR(:p__linq__0, "Extent1"."Name"), 0) ) > 0)
Run Code Online (Sandbox Code Playgroud)

你知道EndsWith或REVERSE方法有什么问题吗?

环境

  • EF5.0
  • .NET4.5
  • Oracle11g中
  • ODP.NET11.2第3版

c# linq entity-framework odp.net oracle11g

10
推荐指数
1
解决办法
1561
查看次数

为什么SqlQuery比在视图上使用LINQ表达式快得多?

我想从一个视图查询数据,这是一个包含583,000条记录的表的视图.所以我写了一个简单的查询来从这个视图中查询

var uuid = "AB1-23456";
dbSet.SingleOrDefault(x => x.UserKey == uuid);
Run Code Online (Sandbox Code Playgroud)

这是生成的sql

SELECT "Extent1"."UserKey" AS "UserKey", 
       CAST("Extent1"."IsDeleted" AS number(3,0)) AS "C1", 
       "Extent1"."FirstName" AS "FirstName", 
       "Extent1"."LastName" AS "LastName", 
       "Extent1"."UserLogin" AS "UserLogin", 
       "Extent1"."AccLocationKey" AS "AccLocationKey", 
       "Extent1"."CompanyKey" AS "CompanyKey"
FROM "UsersView" "Extent1"
WHERE ('AB1-23456' = "Extent1"."UserKey")
Run Code Online (Sandbox Code Playgroud)

我运行了5次查询.第一次调用花了我350ms,下次调用平均花了我150ms这个查询太慢了,所以我把查询更改为这样

var queryString = 
    "SELECT \"Extent1\".\"UserKey\" AS \"UserKey\", " +
            "CAST( \"Extent1\".\"IsDeleted\" AS number(3,0)) AS \"IsDeleted\", " +
            "\"Extent1\".\"FirstName\" AS \"FirstName\", " +
            "\"Extent1\".\"LastName\" AS \"LastName\", " +
            "\"Extent1\".\"UserLogin\" AS \"UserLogin\", " +
            "\"Extent1\".\"AccLocationKey\" …
Run Code Online (Sandbox Code Playgroud)

c# sql entity-framework oracle11g

9
推荐指数
1
解决办法
782
查看次数

ODP.net 12c第3版:如何配置在某些情况下映射到bool的数字(1,0)和某些情况下的int16

问题

我有这样一张桌子:

MyModel
MyShortField Number(1,0)
MyBoolField Number(1,0)
Run Code Online (Sandbox Code Playgroud)

我想MyBoolField只存储0和1,但我想MyShortField存储1-9.所以,在EDMX,我定MyBoolField要Boolean和MyShortField到Int16

我配置这样的映射

<oracle.manageddataaccess.client>
  <version number="*">
    <edmMappings>
      <edmNumberMapping>
        <add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number"/>
        <add NETType="int16" MinPrecision="1" MaxPrecision="5" DBType="Number"/>
      </edmNumberMapping>
    </edmMappings>
  </version>
</oracle.manageddataaccess.client>
Run Code Online (Sandbox Code Playgroud)

它没用.好像我的bool映射被覆盖了int16.有运行时异常

Models.MyTestApp.msl(21,12):错误2019:指定的成员映射无效.类型'Model.MyModel'中成员'MyBoolField'的类型'Edm.Boolean [Nullable = True,DefaultValue =]'与'OracleEFProvider.number不兼容[Nullable = True,DefaultValue =,Precision = 1,Scale = 0 ''成员'MyBoolField'在'Model.Store.MyModel'类型中.

我尝试交换这两行

<add NETType="int16" MinPrecision="1" MaxPrecision="5" DBType="Number"/>
<add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number"/>
Run Code Online (Sandbox Code Playgroud)

这一次,上面的错误消失了,但是出现了新的错误.

Models.MyTestApp.msl(42,12):错误2019:指定的成员映射无效.类型'Model.MyModel'中成员'MyShortField'的类型'Edm.Int16 [Nullable = True,DefaultValue =]'与'OracleEFProvider.number不兼容[Nullable = True,DefaultValue =,Precision = 1,Scale = …

app-config odp.net entity-framework-6 oracle12c

2
推荐指数
1
解决办法
3956
查看次数