在vb.net中无法识别LINQ查询中的Where子句?

时间:2014-07-22 13:36:35

标签: vb.net linq

以下Where子句中无法识别实体字段。 VB错了吗?

Dim projects = context.projects
               .OrderBy(Function(x) x.name)
               .Select(Function(x) {x.id, x.name})
               .Where(Function(x) x.id <> sourceid)

如果我关闭Where,它可以正常工作。另外,如果我翻转WhereOrderByWhere没问题,但现在OrderBy失败了。

3 个答案:

答案 0 :(得分:3)

试试这个:

Dim projects = context.projects
                               .OrderBy(Function(x) x.name)
                               .Select(Function(x) New With {x.id, x.name})
                               .Where(Function(x) x.id <> sourceid)

New With关键字应创建匿名类型的IEnumerable。然后,您可以使用id子句中的Where属性,而无需更改操作的顺序。

没有什么可以阻止您按顺序执行操作OrderBySelectWhere。上面的代码肯定会编译运行。但是,从逻辑上讲,您需要在Where之前执行Select,因为前者是过滤操作,而后者是投影。

答案 1 :(得分:2)

您能否尝试使用以下代码段。

Dim projects = context.projects.Where(Function(x) x.id <> sourceid).OrderBy(Function(x) x.name).Select(Function(x) {x.id, x.name})

答案 2 :(得分:0)

这个{x.id, x.name}很可能是一个对象数组(假设id是整数而name是字符串,VB会推断出Object)。它不是属性为idname的类的实例。 @ shree.pat18解释了如何调整它以返回你想要的东西,但我建议使用查询语法来清楚,并且在Select之前放置你的where子句(应该稍快一点,因为它不会创建匿名结果中包含您不需要的值的对象:

Dim projects = From p In context.projects
               OrderBy p.name
               Where p.Id <> sourceid
               Select Id = p.Id, Name = p.Name