我在尝试让以下工作时遇到问题。我尝试了两种不同的方式,都编译但在运行时都抛出异常。
解决方案A抛出
NotSupportedException“LINQ to Entities无法识别方法'MyDB.MemberClass GetMemberClass(MyDB.Member,System.DateTime)'方法,并且此方法无法转换为商店表达式。”
解决方案B抛出
NotSupportedException“LINQ to Entities不支持LINQ表达式节点类型'Invoke'。”
这是我的代码:
public delegate string GetClassShortName(Member m, DateTime d);
private void UserControl_Initialized(object sender, EventArgs e)
{
//Solution A
var members = from m in dbContext.Members
where new[] { "A", "P", "S", "J" }.Contains(MemberHelper.GetMemberClass(m, DateTime.Now).ShortName)
orderby m.Line
select m;
//Solution B
GetClassShortName gcsn = (n,d) => (MemberHelper.GetMemberClass(n, d).ShortName);
var members = dbContext.Members.Where(m => new[] { "A", "P", "S", "J" }.Contains(gcsn(m, DateTime.Now)));
foreach (Member m in members)
{
...
我正在努力让那些拥有“类”的成员在一组值中。 (A,P,S,J)。成员的班级取决于您希望它的日期,因为它随着时间的推移而变化。因此,类存储在不同的表中,我使用MemberHelper.GetMemberClass函数来获取指定日期的类。 (在这种情况下,现在)
新解决方案
我放弃了尝试使用LINQ完成所有工作并更改了我的代码,如下所示。可能有一种更优雅的方式来做到这一点,但它确实有效。
var data = from mj in this.dbContext.MemberJournals
where mj.Effective <= date
orderby mj.Member.Line, mj.Effective
select mj;
foreach (MemberJournal mj in data)
{
if (mj.ClassID == MemberHelper.GetMemberClass(mj.Member, date).ID)
{
if (new[] { "A", "P", "J", "S" }.Contains(mj.MemberClass.ShortName.Trim()))
{
//Perform my Task
...
}
}
}
答案 0 :(得分:3)
您无法在要转换为SQL的代码中调用任意C#方法。可以转换为SQL的代码是其他有效C#的非常有限子集。