为什么 entity framework 不在此 LinQ 子查询中使用 like?
Why does not entity framework use the like in this LinQ subquery?
我试图通过这种方式获取 tamble 的字符串字段作为子查询的结果:
List<MyType> lstResult = dbContext.MyType
.Where(x=>x.MyStringField.StartsWith(dbContext.MyType.Where(y=>y.ID == 123).MyStringField));
结果是这样的:
WHERE ( CAST(CHARINDEX([Project2].[MyStringField], [Extent1].[MyStringField]) AS int)) = 1
但这并没有使用类似的东西,给我的结果是不正确的。
但是,如果我使用这个查询:
List<MyType> lstResult = dbContext.MyType
.Where(x=>x.MyStringField.StartsWith("Abcd");
这是哪里:
WHERE [Extent1].[MyStringField] LIKE 'Abcd%'
为什么第一种情况查询不使用like?在其他情况下,我使用这样的子查询,尽管使用的是 ID(长类型字段)并且查询 os 正确。当字段是字符串时,也许我错过了一些东西。
非常感谢。
我认为这不会编译,因为 Where 语句甚至没有被枚举为 "Where" 方法是一个延迟方法,在您使用方法枚举它之前不会 return 任何结果像 "Single, First, etc...".
现在,将您的请求更改为如下内容:
// get the string that we want to check against.
var myStringField = dbContext.MyType.Single(y=>y.ID == 123).MyStringField; // <== you can use SingleOrDefault instead if you are not sure that the row is there, as this will throw exception if there is no MyType with id = 123.
List<MyType> lstResult = dbContext.MyType
.Where(x=>x.MyStringField.StartsWith(myStringField)).ToList();
希望对您有所帮助。
我试图通过这种方式获取 tamble 的字符串字段作为子查询的结果:
List<MyType> lstResult = dbContext.MyType
.Where(x=>x.MyStringField.StartsWith(dbContext.MyType.Where(y=>y.ID == 123).MyStringField));
结果是这样的:
WHERE ( CAST(CHARINDEX([Project2].[MyStringField], [Extent1].[MyStringField]) AS int)) = 1
但这并没有使用类似的东西,给我的结果是不正确的。
但是,如果我使用这个查询:
List<MyType> lstResult = dbContext.MyType
.Where(x=>x.MyStringField.StartsWith("Abcd");
这是哪里:
WHERE [Extent1].[MyStringField] LIKE 'Abcd%'
为什么第一种情况查询不使用like?在其他情况下,我使用这样的子查询,尽管使用的是 ID(长类型字段)并且查询 os 正确。当字段是字符串时,也许我错过了一些东西。
非常感谢。
我认为这不会编译,因为 Where 语句甚至没有被枚举为 "Where" 方法是一个延迟方法,在您使用方法枚举它之前不会 return 任何结果像 "Single, First, etc...".
现在,将您的请求更改为如下内容:
// get the string that we want to check against.
var myStringField = dbContext.MyType.Single(y=>y.ID == 123).MyStringField; // <== you can use SingleOrDefault instead if you are not sure that the row is there, as this will throw exception if there is no MyType with id = 123.
List<MyType> lstResult = dbContext.MyType
.Where(x=>x.MyStringField.StartsWith(myStringField)).ToList();
希望对您有所帮助。