我在尝试使以下工作时遇到问题。我尝试了 2 种不同的方式,都可以编译,但都在运行时抛出异常。
解决方案 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
...
}
}
}