gpt4 book ai didi

c# - 当对象具有集合属性时投影 IQueryable 时 Automapper 失败
转载 作者:太空狗 更新时间:2023-10-29 22:53:29 24 4
gpt4 key购买 nike

所以,这是我的情况。我有两个类(class):

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 Issue 159 .

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

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

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

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

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

关于c# - 当对象具有集合属性时投影 IQueryable<object> 时 Automapper 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10291879/

24 4 0