我正在尝试使用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列表
我需要能够选择更多属性,而不仅仅是名称.
我怀疑你的问题是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)
| 归档时间: |
|
| 查看次数: |
12319 次 |
| 最近记录: |