Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实体框架LINQ查询使用自定义C类方法-一次是,一次否-因为在客户端或SQL中执行?_Linq_Entity Framework_Entity Framework 4_Linq To Entities - Fatal编程技术网

实体框架LINQ查询使用自定义C类方法-一次是,一次否-因为在客户端或SQL中执行?

实体框架LINQ查询使用自定义C类方法-一次是,一次否-因为在客户端或SQL中执行?,linq,entity-framework,entity-framework-4,linq-to-entities,Linq,Entity Framework,Entity Framework 4,Linq To Entities,我编写了两个Entity Framework 4 Linq查询,它们使用自定义类方法,一个有效,一个无效: 自定义方法是: public static DateTime GetLastReadToDate(string fbaUsername, Discussion discussion) { return (discussion.DiscussionUserReads.Where(dur => dur.User.aspnet_User.UserName == fbaUsername).

我编写了两个Entity Framework 4 Linq查询,它们使用自定义类方法,一个有效,一个无效:

自定义方法是:

public static DateTime GetLastReadToDate(string fbaUsername, Discussion discussion)
{
 return (discussion.DiscussionUserReads.Where(dur => dur.User.aspnet_User.UserName == fbaUsername).FirstOrDefault() ?? new DiscussionUserRead { ReadToDate = DateTime.Now.AddYears(-99) }).ReadToDate;
}
有效的linq查询在from之后调用from,相当于SelectMany:

  from g in oc.Users.Where(u => u.aspnet_User.UserName == fbaUsername).First().Groups
  from d in g.Discussions
  select new
  {
   UnReadPostCount = d.Posts.Where(p => p.CreatedDate > DiscussionRepository.GetLastReadToDate(fbaUsername, p.Discussion)).Count()
  };
不起作用的查询更像是常规选择:

  from d in oc.Discussions
  where d.Group.Name == "Student"
  select new 
  {
   UnReadPostCount = d.Posts.Where(p => p.CreatedDate > DiscussionRepository.GetLastReadToDate(fbaUsername, p.Discussion)).Count(),
  };
我得到的错误是:

LINQ to Entities does not recognize the method 'System.DateTime GetLastReadToDate(System.String, Discussion)' method, and this method cannot be translated into a store expression.
我的问题是,为什么我能够在第一个查询中使用我的自定义GetLastReadToDate方法,而不是在第二个查询中?我想这与在db服务器上执行什么以及在客户机上执行什么有关?这些查询似乎使用了GetLastReadToDate方法,但是非常类似,我想知道为什么第一种方法有效而第二种方法无效,最重要的是,是否有一种方法可以将常见的查询语法(如GetLastReadToDate方法中的语法)分解到一个单独的位置,以便在其他几个不同的LINQ查询中重用

请注意,所有这些查询都共享相同的对象上下文

最重要的是,如果有一种方法可以将常见的查询语法(如GetLastReadToDate方法中的语法)分解到一个单独的位置,以便在LINQ查询的几个不同位置重用

存储过程可能是存储“公共查询语法…EF(至少4.0版)的一种方法,它与SP的配合非常好

最重要的是,如果有一种方法可以将常见的查询语法(如GetLastReadToDate方法中的语法)分解到一个单独的位置,以便在LINQ查询的几个不同位置重用


存储过程可能是存储“公共查询语法…EF,至少4.0,与SP配合使用非常好”的一种方法。

我认为最好在此处使用

在数据库中定义一个标量函数,该函数返回日期时间,传递任何需要的内容,将其映射到模型上,然后在LINQ查询中使用:

from g in oc.Users.Where(u => u.aspnet_User.UserName == fbaUsername).First().Groups
  from d in g.Discussions
  select new
  {
   UnReadPostCount = d.Posts.Where(p => p.CreatedDate > myFunkyModelFunction(fbaUsername, p.Discussion)).Count()
  };

我认为你最好在这里用一个

在数据库中定义一个标量函数,该函数返回日期时间,传递任何需要的内容,将其映射到模型上,然后在LINQ查询中使用:

from g in oc.Users.Where(u => u.aspnet_User.UserName == fbaUsername).First().Groups
  from d in g.Discussions
  select new
  {
   UnReadPostCount = d.Posts.Where(p => p.CreatedDate > myFunkyModelFunction(fbaUsername, p.Discussion)).Count()
  };

不能在数据库上执行的查询中调用自定义方法。您只能在对象已在内存中的查询中使用它们。因此,第一个查询之所以有效,是因为在第一个from语句之后,所有其他内容都在内存中执行?是否有任何方法可以封装LINQ查询段,以便在几个不同的消费查询中使用,即使这些查询是在服务器上执行的?您不能在数据库上执行的查询中调用自定义方法。您只能在对象已在内存中的查询中使用它们。因此,第一个查询之所以有效,是因为在第一个from语句之后,所有其他内容都在内存中执行?是否有任何方法可以封装LINQ查询段,以便在几个不同的消费查询中使用,即使这些查询是在服务器上执行的?