从linq查询中选择一个新类型

Ale*_*lex 4 c# linq

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

我的代码到目前为止:

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

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

结果类如下:

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
}
Run Code Online (Sandbox Code Playgroud)

当这个运行时,我明白了

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

知道出了什么问题吗?

编辑:

根据Chris的建议,我尝试了像To这样的Select after:

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 });
Run Code Online (Sandbox Code Playgroud)

但是,这次,类似的错误,但它与匿名类型有关:

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

编辑2:

为了澄清,.Query返回IQueryable
底层数据库是MongoDB(使用C#驱动程序)

如果我这样做:

var disciplines = _repository.Query()
    .Select(d => d.DisciplineName)
    .Distinct()
    .ToList()
Run Code Online (Sandbox Code Playgroud)

有用.通过工作,我的意思是我得到一个distinctDisciplineNames列表

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

Eni*_*ity 6

我怀疑你的问题是MongoDB驱动程序不知道如何创建一个Discipline对象(或者是一个匿名对象).

你需要离开IQueryable<>并进入IEnumerable<>以完成这项工作.

试试这个:

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

.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();
Run Code Online (Sandbox Code Playgroud)

  • 哦,上帝,我觉得对于那些使用这种情况并且有大量数据的人来说很糟糕. (3认同)