实体框架LINQ查询使用自定义C类方法-一次是,一次否-因为在客户端或SQL中执行?
我编写了两个Entity Framework 4 Linq查询,它们使用自定义类方法,一个有效,一个无效: 自定义方法是:实体框架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).
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查询段,以便在几个不同的消费查询中使用,即使这些查询是在服务器上执行的?