【问题标题】:.NET Linq to SQL: select average with where-clause.NET Linq to SQL:使用 where 子句选择平均值
【发布时间】:2010-08-12 08:28:02
【问题描述】:

我有一个包含电影的表格,其中有一个称为排名的整数属性。我现在想从包含某个演员的所有电影中检索平均排名。

Dim q2 = (From p In dc.Movies Where p.actlist.Contains(actor.name) Select p.ranking).Average()

此查询不起作用 - 重载解析失败,因为没有可访问的“平均”接受此数量的参数。如果没有 Where 子句,它运行良好。

如何将 Average 函数与 Where 子句结合使用?我在 MSDN 和互联网上找不到任何有用的例子..

【问题讨论】:

  • actlist 是字符串列表还是演员列表?
  • actlist 是我的电影表的文本属性。它包含电影中所有演员的 xml 样式字符串,例如 Actor 1Actor 2。 Dim q1 = (From p In dc.Movies Where p.actlist.Contains(actor.name) Select p).Count() 返回某个演员所在的电影数量 - 此查询运行良好 ...

标签: linq-to-sql average


【解决方案1】:

可能没有结果,因此无法给出平均值;试试

Dim q2 = (From p In dc.Movies Where p.actlist.Contains(actor.name) Select p.ranking).Count() == 0 ? 0 : (From p In dc.Movies Where p.actlist.Contains(actor.name) Select p.ranking).Average();

【讨论】:

  • 这将导致运行时错误(序列不包含元素),而不是编译时错误。
【解决方案2】:

你能不能试试下面的代码:

Dim avgRanking = (From m in dc.Movies _
                  Where m.actlist.Contains(actor.Name) _
                  Select m.ranking).Average(Function(a) Convert.ToInt32(a))

这也应该有效:

Dim avgRanking = (From m in dc.Movies _
                  Where m.actlist.Contains(actor.Name) _
                  Select CInt(m.ranking)).Average()

问题在于Movie.ranking 的类型。您查询的结果是和IEnumerabletinyint。对此没有Average 的重载。

【讨论】:

  • 这个不工作,构建失败,错误“名称”不是“字符”的成员。 :-( Actlist 只是一个带有 xml 格式内容的字符串。
  • 在那种情况下我的回答不是很有用:)
  • 你知道如何达到我想要的结果吗?
  • Movie.ranking 的类型是 tinyint。使用 Enumerable.Average 的查询因“重载解析失败,因为可以在没有缩小转换范围的情况下调用无法访问的 'Average'...”
【解决方案3】:

我自己想通了:

Dim q3 = (From a In dc.Movies Where a.actlist.Contains(actor.name) Select a).Average(Function(r) r.ranking)

但是,如果演员不在任何电影中,则此选项会引发异常。所以我不得不把它放在 try..cast 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多