为什么实体框架在这个LinQ子查询中没有使用类似的东西?

时间:2015-01-06 17:12:56

标签: linq entity-framework subquery

我试图通过这种方式获得子查询结果的字符串字段:

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%'

为什么在第一种情况下查询不使用类似的?在其他情况下,我使用这样的子查询,虽然使用ID(长类型字段)和查询os正确。当字段是一个字符串时,也许我会想念一些东西。

非常感谢。

1 个答案:

答案 0 :(得分:1)

我认为这不会编译,因为Where语句甚至没有枚举为“Where”方法是一个Deferred方法,它不会返回任何结果,直到你使用像“Single,First”等方法枚举它。 ..“。

现在,将您的请求更改为:

// 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();
希望这有帮助。