当对象具有集合属性时,自动捕获在投影IQueryable <object>时失败

Tob*_*bin 5 .net c# automapper

所以,这是我的情况.我有两个班:

class FromClass
{
    public string[] Foo { get; set; }
}

class ToClass
{
    public string[] Foo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这些类具有数组属性.它们可以是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"

    }
}
Run Code Online (Sandbox Code Playgroud)

为什么test2会抛出InvalidOperationException?如果我制作的Foo东西不是一个集合,例如一个string或其他类 - 那么一切都很完美.

难道我做错了什么?没理解什么?还是我遇到了一个bug?

nem*_*esv 8

我会说:这是一个错误:见Github Issue 159.

AutoMapper.QueryableExtensions在Mapper.CreateMapExpression内部使用,所以如果你写:

var expression = Mapper.CreateMapExpression<FromClass, ToClass>();
Run Code Online (Sandbox Code Playgroud)

它也会因同样的异常而失败.

看来Mapper.CreateMapExpression目前不支持:

  • 价值类型的通用集合,例如List<string>等.
  • 复杂类型或值类型例如阵列string[],Bar[]等等.

但如果你做到FooList<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();
Run Code Online (Sandbox Code Playgroud)

你可以评论上面提到的问题或用你的代码创建一个新问题(这是一个非常好的bug的重复)