为什么 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();

希望对您有所帮助。