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

标签 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();

结果类如下:

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
}

当它运行时,我得到

Unable to determine the serialization information for the expression: < MemberInitExpression >

知道出了什么问题吗?

编辑:

根据 Chris 的建议,我尝试了像这样在 ToList 之后选择:

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 });

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

Unable to determine the serialization information for the expression: new __AnonymousType(d.DisciplineCode, d.DisciplineName).

编辑 2:

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

如果我这样做:

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

它有效。通过作品,我的意思是我得到了一个 distinct 的 DisciplineNames 列表

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

最佳答案

我怀疑您的问题是 MongoDB 驱动程序不知道如何创建 Discipline对象(或与此相关的匿名对象)。

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

试试这个:

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

.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();

关于c# - 从 linq 查询中选择一个新类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11362594/

相关文章:

c# - 将对象传递给 COM 方法

c# - 获取、更改和更新副本缓存

c# - 当输出参数是一个类时,如何在 C++ 中调用 COM 方法?

c# - 有没有办法等待 Actor 完全停止?

c# - 使用 Linq 添加数组数组的索引位置值

c# - Entity Framework 中多个相似实体类型的常见查询

c# - 在 UWP 上以 Json 形式发送请求

mysql - Entity Framework Core Linq 其中 NULL 不起作用

c# - Entity Framework 按查询中的行字段降序排序

c# - 如何将 IEnumerable<string> 转换为一个逗号分隔的字符串?