当对象具有集合属性时,自动映射器在投影 IQueryable 时失败
2024-04-18

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

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

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

这些类具有数组属性。他们可能是List<T> or 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不是集合的东西,例如Astring或其他一些类——那么一切都会完美运行。

难道我做错了什么?不明白什么?或者我遇到了错误吗?


我会说:这是一个错误:参见Github 第 159 期 https://github.com/AutoMapper/AutoMapper/issues/159.

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

var expression = Mapper.CreateMapExpression<FromClass, ToClass>();

它也会因相同的异常而失败。

它似乎Mapper.CreateMapExpression目前不支持:

  • 值类型的通用集合,例如List<string> etc.
  • 复杂类型或值类型的数组,例如string[], Bar[] etc.

但如果你让你的Foo to 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();

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当对象具有集合属性时,自动映射器在投影 IQueryable 时失败 的相关文章

随机推荐