2

我最近一直在升级我的数据库并收到此错误

基本上我所做的如下:

我有一张Participants桌子,里面有一个Name, First Name, E-mail address, ... 现在我把它重构为一张Persons桌子和一张Participants桌子。每个都通过 UUIDparticipant链接到一个。person我已经从表中删除了Nameand ,它们现在在表中。First NameparticipantsPersons

在我的参与者部分课程中:

public partial class Participant {
    public string Name {
        get {
            return this.Person.Name;
        }
    }

    public string FirstName {
        get {
            return this.Person.FirstName;
        }
    }

}

所以现在我的整个项目仍然可以找到名称,而且我不必一次编辑大量代码。

但是,以下查询让我遇到了麻烦:

      _db.Participants.Where(q => whatever).OrderBy(q => q.Name).ThenBy(q => q.FirstName).ToList();

这引发了臭名昭著的The member 'xxx.Models.Participants.Name' has no supported translation to SQL

有没有办法简单地告诉 SQL 生成器Participants.Name实际上是Participants.Person.Name

4

2 回答 2

2

免责声明:如果您这样做是为了能够在不修改的情况下使用以前编写的查询,那么您非常不走运。但是,如果您这样做是为了封装和代码管理,请继续阅读。


有一种方法,但是有点笨拙。

首先,您将不得不向您的Participant类添加表达式(因为 LINQ 和 EF 使用表达式,而不是已经编译的代码):

public partial class Participant
{
    public static readonly Expression<Func<Participant, string>>
        NameExpression = p => p.Person.Name;

    public static readonly Expression<Func<Participant, string>>
        FirstNameExpression = p => p.Person.FirstName;

您可以按照当前编写的方式继续使用您的属性:

    [NotMapped]
    public string Name
    {
        get
        {
            return this.Person.Name;
        }
    }

或者,为了减少代码重复,您可以引用静态表达式:

    [NotMapped]
    public string FirstName
    {
        get
        {
            return Participant.FirstNameExpression.Compile().Invoke(this);
            // if you do this, you might want to consider caching the delegate
            // returned by Expression.Compile()
        }
    }
}

最后,当您创建 LINQ 查询时,您必须使用 lambda 语法,但您可以使用您制作的表达式来代替直接写入查询的临时表达式:

IEnumerable<Participant> participants = _db.Participants
//  .Where(q => whatever)
    .OrderBy(Participant.NameExpression)
    .ThenBy(Participant.FirstNameExpression)
    .ToList();
于 2013-03-05T07:32:22.397 回答
1

如果我无论如何都必须编辑查询,我不妨使用这样的扩展:

public static class MyExtensions {
    public static IQueryable<Participant> InDefaultOrder(this IQueryable<Participant> source) {
        return source.OrderBy(q => q.Person.Name).ThenBy(q => q.Person.FirstName);
    } 
}

那么我的查询将只是:_db.Participants.Where(q => whatever).InDefaultOrder().ToList();

如果它发生变化,它会很容易编辑和维护。

- - 编辑 - -

我还必须添加这个

public static class MyExtensions {
    public static IEnumerable<Participant> InDefaultOrder(this IEnumerable<Participant> source) {
        return source.OrderBy(q => q.Person.Name).ThenBy(q => q.Person.FirstName);
    } 
}
于 2013-03-05T08:29:00.577 回答