<object> 当对象具有集合属性时,投影 IQueryable 时自动映射器失败



所以,这是我的情况。我有两门课:

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

您可以对上述问题发表评论或使用您的代码创建一个新问题(这是该错误的一个很好的重现)

最新更新