【问题标题】:Linq to entities custom function in select选择中的Linq到实体自定义功能
【发布时间】: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 映射到查询中。

标签: linq linq-to-entities


【解决方案1】:

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

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


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

【讨论】:

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