【问题标题】:Automapper fails when projecting IQueryable<object> when object has a collection property当对象具有集合属性时,投影 IQueryable<object> 时 Automapper 失败
【发布时间】:2012-04-24 04:49:00
【问题描述】:

所以,这是我的情况。我有一个我的两个类:

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

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

类的属性是数组。它们可能是List&lt;T&gt;IEnumerable&lt;T&gt;,在任何一种情况下我都会得到相同的结果。

我尝试使用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 或其他类——然后一切正常。

我做错了吗?不明白什么?还是我遇到了错误?

【问题讨论】:

    标签: c# .net automapper


    【解决方案1】:

    我会说:这是一个错误:请参阅Github Issue 159

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

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

    同样的异常也会失败。

    看来Mapper.CreateMapExpression目前不支持:

    • 值类型的通用集合,例如List&lt;string&gt;
    • 复杂类型或值类型的数组,例如string[]Bar[] 等。

    但如果你将Foo 设置为List&lt;Item&gt; 它可以工作:

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

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

    【讨论】:

    • 啊,这正是问题所在。谢谢你。使用复杂类型确实有效(只要那里有明确的CreateMap&lt;Item,Item&gt;() 调用,在普通映射情况下似乎不需要)。
    • 我评论了the github issue。同时,使用复杂类型列表的变通方法工作得很好。再次干杯!
    • 嗯。 github问题已关闭。不幸的是,这似乎是一个“WontFix”。
    猜你喜欢
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多