我有一张看起来像这样的表:
Foo
FooId : int (PK)
BarId : int
Baz : bit
etc.
它有其他列(等),但我有一个特定的查询,我想运行它来预测一些统计信息。 SQL中的查询如下所示:
SELECT
BarId,
SUM(CAST(Baz AS INT)) AS BazCount
FROM Foo GROUP BY BarId;
因此,我创建了一个Presentation Model类来保存数据,因此我可以将其返回给客户端。
public partial class FooStatistics
{
public int BarId { get; set; }
public int BazCount { get; set; }
}
我不是百分百确定如何在LINQ中执行相同的查询并将其投影到此对象中,但我给它一个这样的镜头:
FooStatistics stats = (
from f in ctx.Foo
where <clauses here>
group f by f.BarId
into StatsGroup
select new FooStatistics() {
BarId = StatsGroup.Key,
BazCount = StatsGroup.Sum(f => Int32.Parse(f.Baz.ToString()))
}
).FirstOrDefault();
这会引发错误:
LINQ to Entities无法识别方法'Int32 Parse(System.String)'方法,并且此方法无法转换为商店表达式。
所以,我按照这里给出的建议:
我将此添加到我的.edmx XML
<Function Name="ParseInt" ReturnType="Edm.Int32">
<Parameter Name="value" Type="Edm.String" />
<DefiningExpression>
cast(value as Edm.Int32)
</DefiningExpression>
</Function>
然后我添加了一个部分类来定义方法:
public partial class MyEntities
{
[EdmFunction("MyEntities", "ParseInt")]
public static Int32 ParseInt(string value)
{
return Int32.Parse(value);
}
}
我将LINQ更改为:
FooStatistics stats = (
from f in ctx.Foo
where <clauses here>
group f by f.BarId
into StatsGroup
select new FooStatistics() {
BarId = StatsGroup.Key,
BazCount = StatsGroup.Sum(f => MyEntities.ParseInt(f.Baz.ToString()))
}
).FirstOrDefault();
但这会爆发:
LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式。
因此,我将.edmx XML中的函数更改为:
<Function Name="BoolToInt32" ReturnType="Edm.Int32">
<Parameter Name="value" Type="Edm.Boolean" />
<DefiningExpression>
cast(value as Edm.Int32)
</DefiningExpression>
</Function>
然后我相应地将我的静态ParseInt更改为BoolToInt32并且我更改了LINQ以使用该功能,但现在它爆炸了:
指定的方法'Int32 BoolToInt32(Boolean)'无法转换为LINQ to Entities存储表达式。
我是否接近,或者我完全错了......?
提前致谢
答案 0 :(得分:2)
如果Baz有点,你可以添加一个地方然后只使用如下的Count()
FooStatistics stats = (
from f in ctx.Foo
where <clauses here>
and f.Baz
group f by f.BarId
into StatsGroup
select new FooStatistics() {
BarId = StatsGroup.Key,
BazCount = StatsGroup.Count()
}
).FirstOrDefault();