Red*_*dog 5 .net c# linq-to-entities entity-framework
我们正在迁移一些代码以使用Entity Framework并且有一个尝试对Nullable字段进行排序的查询,并提供一个默认排序值,使用Nullable.GetValueOrDefault(T)函数将值设置为null .
但是,执行时它会返回以下错误:
LINQ to Entities无法识别方法'Int32 GetValueOrDefault(Int32)'方法,并且此方法无法转换为存储表达式.
查询看起来像:
int magicDefaultSortValue = 250;
var query = context.MyTable.OrderBy(t => t.MyNullableSortColumn
.GetValueOrDefault(magicDefaultSortValue));
Run Code Online (Sandbox Code Playgroud)
从这个答案我可以看到有一种方法可以在您的EDMX中提供"翻译".我们可以为这个合并函数编写类似的翻译吗?
注意:当我尝试时,??合并操作符而不是查询中的GetValueOrDefault它确实有效.那么也许是什么使得这项工作可以被利用?
Jef*_*ata 12
我相信你找到了答案.当您使用时??,EF使用a生成SQL,CASE如果值为null,则选择您的排序值,然后对其进行排序.
MyTable.OrderBy (t => t.MyNullableSortColumn ?? magicDefaultSortValue).ToArray();
Run Code Online (Sandbox Code Playgroud)
将生成以下sql:
-- Region Parameters
DECLARE p__linq__0 Int = 250
-- EndRegion
SELECT
[Project1].[MyColumn1] AS [MyColumn1],
[Project1].[MyNullableSortColumn] AS [MyNullableSortColumn]
FROM ( SELECT
CASE WHEN ([Extent1].[MyNullableSortColumn] IS NULL) THEN @p__linq__0 ELSE [Extent1].[MyNullableSortColumn] END AS [C1],
[Extent1].[MyColumn1] AS [MyColumn1],
[Extent1].[MyNullableSortColumn] AS [MyNullableSortColumn]
FROM [dbo].[MyTable] AS [Extent1]
) AS [Project1]
ORDER BY [Project1].[C1] ASC
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我建议使用LINQPad,它可以让你使用你的EF模型并查看正在生成的sql.此外,了解EntityFunctions类和SqlFunctions类是有帮助的,因为它们提供了对几个有用函数的访问.
| 归档时间: |
|
| 查看次数: |
5228 次 |
| 最近记录: |