具有 Lightswitch 计算属性的 Linq to SQL 查询过滤器

Posted

技术标签:

【中文标题】具有 Lightswitch 计算属性的 Linq to SQL 查询过滤器【英文标题】:Linq to SQL query filter with Lightswitch computed property 【发布时间】:2017-04-24 02:06:09 【问题描述】:

根据我在上一个问题中收到的帮助/建议,我设法将问题缩小到计算属性。

这是失败的查询过滤:

query = query.Where(a => a.collection.Any(b => b.Name.StartsWith(c)));

那里的一切似乎都工作正常,但Name 导致查询失败。 Nameb 的计算属性,当我将其替换为标准属性时,查询有效。

我不明白这在 sql 中意味着什么,所以我不知道如何修复/替换它,所以我可以按该属性进行过滤。如果有人能解释该查询背后出了什么问题,我们将不胜感激。

【问题讨论】:

你现有的查询会抛出异常,因为在不确保collection 不为空或空的情况下,它会在遇到任何时候抛出异常。 【参考方案1】:

计算属性未在底层数据库中定义,因此您无法在查询中引用它们。

【讨论】:

我就是这么想的。有什么办法绕过它? 马特一针见血。这是一篇写得很好的文章,可以提供一些关于如何处理“计算属性”和 EF 的见解:daveaglick.com/posts/computed-properties-and-entity-framework @SRQCoder 非常好的文章!将继续阅读,看起来很有希望。 尽管这个答案关于直接使用计算属性是正确的,但我还不能接受它,因为我正在寻找解决这个问题的替代方案/修复方法。 @SRQCoder 评论中的文章很有用,但与 Lightswitch 没有直接关系,特别是它有很多限制。答案很有帮助,所以我现在投了赞成票。【参考方案2】:

您应该能够通过以下方式实现您的目标:

var start = "Joh";
var query = content.Where(entity => 
                  entity.ExampleCollection.Exist(obj => 
                  obj.Name.StartsWith(start));

这将根据集合中的Exist 是否符合您的开始条件进行过滤。

【讨论】:

Exist 未定义。如果有帮助,我正在使用 Lightswitch oob。 您指出的null 收藏的潜在问题是真实存在的,但这不是我要解决的问题。

以上是关于具有 Lightswitch 计算属性的 Linq to SQL 查询过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 LINQ 将 TimeSpan 计算转换为 SQL

Linq 确保没有两个对象具有相同的属性值

如何选择具有最低属性 linq 查询语法的对象

如何使用 LINQ 选择具有最小或最大属性值的对象

使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值

ASP.NET 5 和 EF - 用 LINQ 替换子列表