gpt4 book ai didi

c# - 尝试返回 IQueryable 时出现转换错误

转载 作者:太空狗 更新时间:2023-10-29 21:09:16 24 4
gpt4 key购买 nike

我有一个应该返回 IQueryable<MyType> 的查询.代码如下所示:

public IQueryable<MyType> GetFooList()
{
var query = (from x in dbContext.TableX
join y in dbContext.TableY on x.our_id equals y.our_id
join z in dbContext.TableZ on y.our_id equals z.our_id
join a in dbContext.TableA on z.other_id equals a.other_id
where !string.IsNullOrEmpty(x.status)
select new
{
(fields....)
})
.AsQueryable();
IQueryable<MyType> result = (IQueryable<MyType>) query;
return result;
}

在调用 Controller 操作中,我想根据运行时指定的值过滤此列表;要过滤的参数在各种调用操作之间会有所不同。例如:

List<MyType> FooList = Interface.GetFooList()
.Where( specific conditions )
.ToList();

上线设置result ,引发异常:

用户代码未处理无效的转换异常

Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery'1[<>f__AnonymousType9'9[System.String,System.Nullable`1[System.DateTime],System.String,System.String,System.String,System.String,System.Int32,System.Nullable'1[System.DateTime],System.Nullable'1[System.DateTime]]]' to type 'System.Linq.IQueryable'1[MyType]'.

所以我认为这是一个转换问题,并添加了 .Cast<MyType>()在调用 AsQueryable() 之前.这会产生不同的错误:

Unable to cast the type 'Anonymous type' to type 'MyType'. LINQ to Entities only supports casting EDM primitive or enumeration types.

如果我不进行任何转换,这些错误将在调用操作中出现,而不是在 Entity Framework 访问器中出现。

我已经尝试了所有链接的“类似问题”中的建议,但无济于事——错误不断出现。我什至尝试包括 .Select(obj => new MyType() {fields...} )摆脱匿名类型。那也没用。

我觉得我遗漏了一些非常明显的东西。

编辑添加

我更新了代码以选择一个类型:select new MyType() {fields...} .这工作正常。然后调用方法抛出一个 NotSupportedException,在我过滤结果并从查询中创建列表的那一行:

The entity or complex type 'MyType' cannot be constructed in a LINQ to Entities query.

ETA2

我将 EF 表属性复制到新类 MyTypeDTO。我用 MyTypeDTO 替换了所有对 MyType 的使用。我收到此错误:

The specified type member 'our_id' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

这是 DTO 中的属性:

public int our_id { get; set; }

所以我删除了 get/set,重建并重新运行。不,我遇到了同样的错误。

最佳答案

你是对的,你所有的转换都失败的原因是匿名类型(即你用 select new {...} 构造创建的东西)不能转换为命名类型。

I even tried including .Select(obj => new MyType() {fields...} ) to get away from the anonymous type. That didn't work either.

您走在正确的轨道上 - 这应该有效,假设 MyType 具有适当的 setter :

 var query = from x in dbContext.TableX
join y in dbContext.TableY on x.our_id equals y.our_id
join z in dbContext.TableZ on y.our_id equals z.our_id
join a in dbContext.TableA on z.other_id equals a.other_id
where !string.IsNullOrEmpty(x.status)
select new MyType
{
MyTypeField1 = a.Column1
, MyTypeField2 = z.Column3
, // ...and so on
}; // No need to convert to IQueryable - this should produce the right type
return result;

The entity or complex type 'MyType' cannot be constructed in a LINQ to Entities query.

这是因为 MyType 是一个映射实体。您不应创建返回映射实体的投影,因此 EF 正确地限制了您这样做的能力。您应该能够投影到非映射类型(以创建所谓的 DTO - 数据传输对象)。

定义一个 MyTypeDto 类,它具有 MyClass 的属性,但没有方法或映射。在您的方法定义中使用 MyClassDto。这应该可以解决问题。

关于c# - 尝试返回 IQueryable<MyType> 时出现转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com