选择中的Linq到实体自定义功能

Posted

技术标签:

【中文标题】选择中的Linq到实体自定义功能【英文标题】:Linq to entities custom function in select 【发布时间】:2017-05-15 14:05:12 【问题描述】:

在 Linq to Entities 中,不能使用标准 c# 方法修改“select”子句中的结果,需要规范函数。

我需要调用这样的查询:

CoreEntities.Contracts.Select(
c=> new 
   c.Name,
   c.Type,
   Role = MapToRole(c));

private string MapToRole(Contract contract) 
    switch(contract.Type) 
        case: CTypes.Main: return "somerole1";break;
        case: CTypes.Secondary: return "somerole2";break;
        // ... 
        default: break;
    

    return "none";

“MapToRole”是一个 C# 方法,创建只是为了整理 linq 查询。

有没有办法创建一个可以被实体框架“linq to Entity”解析器接受的自定义 c# 函数?

我找到了查询过滤器的解决方案,但没有找到数据格式化的解决方案。

【问题讨论】:

能否将您的 MapToRole 方法添加到问题中? 在 MapToRole 中有简单的 if/else/switch 语句。 如果您可以将 MapToRole 转换为 Lamba 表达式(使用条件运算符等),那么您可以使用 LINQKit 将 lambda 映射到查询中。 【参考方案1】:

看起来这是一个简单的转换,没有理由需要由提供者翻译。我建议只需在您的 Select() 之前添加 AsEnumerable() 即可将您的投影与提供者“分离”。

或者,您可以在您的数据类型中有一个 CTypes 属性和一个在您的模型中执行该转换的方法/属性。


附带说明一下,在应用程序层中执行此特定转换意味着您只提取枚举值,而不是字符串 - 因此来自提供程序的数据更少。

【讨论】:

将 CTypes 属性添加到我的模型会导致将 Linq 引发到实体异常。此外,该属性正在使用 AutoMapper 映射到另一个模型。 我在 select 中调用函数或在转换前调用 AsEnumerable,导致 EF 检索整行。理想情况下,有一种方法可以只检索匿名对象中要求的列,并将转换转换为 SQL。 @EdwardBrey 这很容易做到,只需在.AsEnumerable 调用之前使用.Select() 将您感兴趣的字段投影到匿名类型,这将确保只有您需要的字段从提供者那里查询。

以上是关于选择中的Linq到实体自定义功能的主要内容,如果未能解决你的问题,请参考以下文章

每个系列的 Pandas groupby 自定义功能

谷歌Poly编辑器开放移动web广告自定义功能

Rails 4 where 并使用自定义功能选择查询

Android recyclerview拖拽自定义功能

后台文章编辑器的可视区域添加自定义功能按钮

扩展XAF模型信息实现自定义功能