我正在尝试使用 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/