我正在尝试使用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
}
当这个运行时,我得到了
无法确定表达式的序列化信息: &LT; MemberInitExpression&gt;
知道出了什么问题吗?
修改
根据克里斯的建议,我尝试了像To这样的选择:
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)。
编辑2:
为了澄清,.Query正在返回IQueryable
底层数据库是MongoDB(使用C#驱动程序)
如果我这样做:
var disciplines = _repository.Query()
.Select(d => d.DisciplineName)
.Distinct()
.ToList()
有效。通过工作,我的意思是我得到一个distinct
DisciplineNames列表
我需要能够选择更多属性,而不仅仅是名称。
答案 0 :(得分:5)
我怀疑你的问题是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();
答案 1 :(得分:0)
不确定为什么你的第一个例子没有运行,看起来很好,请参阅相关问题here。可能它可能是您的数据库驱动程序中的错误?
您可以尝试使用GroupBy来获得相同的结果:
var disciplines = _repository.Query()
.GroupBy(d => new Discipline
{
DisciplineCode = d.DisciplineCode,
Name = d.DisciplineName
}
)
.ToList();