当对象具有集合属性时,投影 IQueryable
本文关键字:object 失败 映射 IQueryable 投影 对象 集合 属性 | 更新日期: 2023-09-27 18:32:13
所以,这是我的情况。我有两门课:
class FromClass
{
public string[] Foo { get; set; }
}
class ToClass
{
public string[] Foo { get; set; }
}
这些类具有数组的属性。它们可能是List<T>
或IEnumerable<T>
,在任何这些情况下我都会得到相同的结果。
我尝试使用以下AutoMapper.QueryableExtensions
从一个映射到另一个:
class Program
{
static void Main(string[] args)
{
// create a "From" object
string[] anArray = new string[] { "a", "b" };
FromClass anObject = new FromClass() { Foo = anArray };
// make a queryable set that includes the "From" object
IQueryable<FromClass> queryableObjects = (new FromClass[] { anObject }).AsQueryable();
// set up AutoMapper
Mapper.CreateMap<FromClass, ToClass>();
Mapper.AssertConfigurationIsValid();
// test plain mapping
IQueryable<ToClass> test1 = queryableObjects.Select(o => Mapper.Map<FromClass, ToClass>(o));
// success!
// test queryable extensions
IQueryable<ToClass> test2 = queryableObjects.Project().To<ToClass>();
// InvalidOperationException: "Sequence contains no elements"
}
}
为什么 test2 会抛出InvalidOperationException
?如果我将Foo
类型制作成不是集合的东西,例如string
或其他类 - 那么一切都很完美。
我做错了什么吗?不明白什么?还是我遇到了错误?
我会
说:这是一个错误:参见Github问题159。
AutoMapper.QueryableExtensions 在内部使用Mapper.CreateMapExpression
,因此如果您编写:
var expression = Mapper.CreateMapExpression<FromClass, ToClass>();
它也将失败,并出现相同的异常。
似乎Mapper.CreateMapExpression
目前不支持:
- 值类型的通用集合,例如
List<string>
等 - 复杂类型或值类型的数组,例如
string[]
、Bar[]
等。
但是,如果您将Foo
List<Item>
它可以工作:
public class FromClass
{
public List<Item> Foo { get; set; }
}
public class ToClass
{
public List<Item> Foo { get; set; }
}
public class Item
{
public string Bar { get; set; }
}
var list = new List<Item> { new Item{ Bar = "a"}, new Item() { Bar= "b" }};
FromClass anObject = new FromClass() { Foo = list };
var queryableObjects = (new FromClass[] { anObject }).AsQueryable();
Mapper.CreateMap<FromClass, ToClass>();
Mapper.CreateMap<Item, Item>();
var test2 = queryableObjects.Project().To<ToClass>().ToArray();
您可以对上述问题发表评论或使用您的代码创建一个新问题(这是该错误的一个很好的重现)