【问题标题】:Apply a custom method on EntityFramework results对 EntityFramework 结果应用自定义方法
【发布时间】:2014-02-18 10:40:23
【问题描述】:

有没有办法做这样的事情?

using (var db = new MyEntities())
{
    // getting all users with EntityFramework 6
    var allUsers = from u in db.Users
                   select new
                   {
                       MyCustomMethod(u.FirstName)
                   };
}

当然,因为 EF6 无法将我的方法转换为 SQL 查询,所以它会引发异常。然后我需要做的是在该结果上创建另一个循环并在成员上运行我的方法,有没有办法不需要第二个循环?

【问题讨论】:

  • MyCustomMethod 是做什么的?
  • 它将一个字节[]反序列化为对象
  • 您的代码中没有循环。 “第二个循环”是什么意思?第一个循环在哪里?

标签: c# .net linq entity-framework linq-to-sql


【解决方案1】:

如果你对 linq 方法链样式没有任何问题,你可以这样做,

db.Users.AsEnumerable().Select(method);

然后写一些这样的方法,

 public string method(User a)
 {
     return a.UserName;
 }

【讨论】:

    【解决方案2】:

    恐怕你不能。

    除非您可以使用 EF 提供的 SqlFunctions 之一,否则您必须构建自己的表达式树,我想如果 MyCustomMethod 的作用是“反序列化一个字节 [] 到和对象”。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      var databaseUsers = from u in db.Users
                          /* add clauses to execute in the database here */
                          select new { u.FirstName };
      
      var allUsers = from u in databaseUsers.AsEnumerable()
                     select new
                     {
                         MyCustomMethod(u.FirstName)
                     };
      

      .AsEnumerable() 调用本质上是告诉 EF,调用后发生的事情不应被转换为数据库逻辑。它不执行任何代码。它只是将表达式的类型从 IQueriable<T> 更改为 IEnumerable<T>

      请参阅AsEnumerable documentation 了解更多信息。

      【讨论】:

      • 正如我在问题中提到的,我现在正在这样做,但我正在寻找一种方法来保存第二个循环。
      • @ken2k 我没有看到使用.AsEnumerable()的OP。
      • @KrisVandermotten OP 有一个循环,这正是 AsEnumerable 在内部所做的。
      • @ken2k 你从哪里得到 AsEnumerable 执行循环的想法?其目的是将表达式的类型从IQueriable<T> 更改为IEnumerable<T>。它的主体本质上是return this;
      猜你喜欢
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多