从 linq 查询中选择新类型

2023-11-30

我正在尝试使用 Linq 转换从存储库中选择的一些数据。

到目前为止我的代码:

Repository<Result> _repository = new Repository<Result>();

var disciplines = _repository.Query()
    .Select(d => new Discipline
    {
        DisciplineCode = d.DisciplineCode,
        Name = d.DisciplineName
    })
    .Distinct()
    .ToList();

结果类如下所示:

public class Result
{
    public virtual int ResultId { get; set; }
    public virtual string DisciplineCode { get; set; }
    public virtual string DisciplineName { get; set; }
    public virtual int CompetitorId { get; set; }
    //other stuff
}

当这个运行时,我得到

无法确定表达式的序列化信息:

知道出了什么问题吗?

EDIT:

根据 Chris 的建议,我在 ToList 之后尝试了 Select,如下所示:

var disciplines = _repository.Query()
                .Select(d => new
                {
                    DisciplineCode = d.DisciplineCode,
                    Name = d.DisciplineName
                })
                .Distinct()
                .ToList()
                .Select(d => new Discipline { DisciplineCode = d.DisciplineCode, Name = d.Name });

然而,这一次,出现了类似的错误,但与匿名类型有关:

无法确定表达式的序列化信息:new __AnonymousType(d.DisciplineCode, d.DisciplineName)。

EDIT 2:

澄清一下,.Query 返回 IQueryable
底层数据库是MongoDB(使用C#驱动)

如果我这样做:

var disciplines = _repository.Query()
    .Select(d => d.DisciplineName)
    .Distinct()
    .ToList()

有用。通过作品,我的意思是我得到了distinct学科名称列表

然而,我需要能够选择更多的属性,而不仅仅是名称。


我怀疑你的问题是 MongoDB 驱动程序不知道如何创建Discipline对象(或就此而言的匿名对象)。

你需要搬出IQueryable<>并进入IEnumerable<>使这项工作成功。

尝试这个:

var disciplines =
    _repository
        .Query()
        .ToArray()
        .Select(d => new Discipline
            {
                DisciplineCode = d.DisciplineCode,
                Name = d.DisciplineName
            })
        .Distinct()
        .ToList();

The .ToArray()这就是神奇之处。让我知道这个是否奏效。

您可能仍然遇到问题.Distinct()调用处理您的自定义类型,因此您可能需要尝试以下操作:

var disciplines =
    _repository
        .Query()
        .ToArray()
        .Select(d => new
            {
                d.DisciplineCode,
                d.DisciplineName
            })
        .Distinct()
        .Select(d => new Discipline
            {
                DisciplineCode = d.DisciplineCode,
                Name = d.DisciplineName
            })
        .ToList();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 linq 查询中选择新类型 的相关文章

随机推荐