gpt4 book ai didi

c# - 无法将类型 X 转换为类型 Y。LINQ to Entities 仅支持转换 EDM 基本类型或枚举类型

转载 作者:行者123 更新时间:2023-11-30 12:26:19 26 4
gpt4 key购买 nike

我完全理解这个错误,但是有没有一种方法可以实现一些代码,以便 linq to entities 理解我的自定义类型应该被视为 decimal 原始类型?

我创建了一个自定义 Money 类型,它的构造函数重载之一接受可为 null 的 decimal。它具有隐式运算符重载和所有其他类型的酷爵士乐。我想在我的 linq to entities 投影中使用这个自定义类型,但可惜标题中的错误。

我是否可以在我的 Money 类型上声明“嘿,为了 linq 投影的目的,我是原始类型 decimal”?

自定义表达式树/访问者是否有某种方式可以帮助声明所有类型的 Money 都将被视为 linq 投影的 decimal 原语?

[HeyImADecimalForLinqProjections] // custom attribute
public class Money : IComparable<Money>
{
public Money()
{
Value = decimal.Zero;
}
public Money(decimal? value)
{
if (value.HasValue)
Value = value.Value;
else
Value = decimal.Zero;
}
public static implicit operator Money(decimal value)
{
return new Money(value);
}
public static implicit operator Money(decimal? value)
{
return new Money(value.Value);
}
...
}

示例投影:

var items = orderQuery.Where(a => a.OrderId = 345)
.Select(a => new OrderModel()
{
OrderId = a.OrderId,
SubtotalIncludingTax = a.SubtotalIncludingTax, // no dice, SubtotalIncludingTax is of type Money - Unable to cast the type 'System.Decimal' to type 'Money'. LINQ to Entities only supports casting EDM primitive or enumeration types.
SubtotalIncludingTaxRaw = a.SubtotalIncludingTax, // this is fine because SubtotalIncludingTaxRaw is of type decimal
})
.ToList();

我目前的解决方案有效,但我讨厌它。我首先转换到匿名类型,然后将匿名类型转换到我的实际模型。这个例子被大大淡化了,这个双投影解决方案导致了很多我宁愿避免的重复。

// first get everything as anonymous projection objects in linq to entities
var anonymousItems = orderQuery.Where(a => a.OrderId = 345)
.Select(a =>
{
OrderId = a.OrderId,
SubtotalIncludingTax = a.SubtotalIncludingTax // decimal to decimal
.ToList();

// now cast to our actual model since we are back in .Net world
var items = anonymousItems
.Select(a => new OrderModel()
{
OrderId = a.OrderId,
SubtotalIncludingTax = a.SubtotalIncludingTax // decimal to Money
.ToList();

最佳答案

目前 Entity Framework 不支持这样的转换。您可以使用映射属性和未映射属性的解决方法,例如:

public decimal RawTotalIncludingTax {get;set;}
public Money TotalIncludingTax
{
get { return RawTotalIncludingtax; }
set { RawTotalIncludingTax = value; }
}

这可能会将额外的匿名类型保存到具体类型选择中,但仍然会给您留下类似的问题。更有可能的解决方案是使用扩展方法来执行以下操作:

using System;

public static class MoneyExtensions
{
public static string Format(this decimal val){
if(val < 0)
return "(" + Math.Abs(val).ToString("N2") + ")";
else
return val.ToString("N2");
}
}

public class Program
{
public static void Main()
{
Console.WriteLine(2.2m.Format());
Console.WriteLine((-12.42m).Format());
}
}

这样您就不需要自定义类型,但仍然可以使用您所追求的 MoneyExtensions 和语法!

关于c# - 无法将类型 X 转换为类型 Y。LINQ to Entities 仅支持转换 EDM 基本类型或枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29195973/

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