【问题标题】:Generic class with expressions throws error in Linq-To-Entities带有表达式的泛型类在 Linq-To-Entities 中引发错误
【发布时间】:2016-04-07 18:33:21
【问题描述】:

我有一些实体Logging 实现了ILogging,假设它只有两个属性:

public partial class Logging : ILogging
{
    public int ID {get; set;}
    public string Name {get; set;}
}
public interface ILogging { int ID {get; set;} }

我最初有一个静态类Logging.Q,其中包含静态Expression<Func<Logging,bool>> 字段,但现在我希望能够为ILogging 编写表达式,如果它们只需要ID

public partial class Logging
{
    public static Q<T> where T : ILogging
    {
        public static Expression<Func<T,bool>> IDOne = l => l.ID == 1;
    }
}

当我这样调用表达式时:

var log = ctx.Logging.Where(Logging.Q<Logging>.IDOne).FirstOrDefault();

我得到了臭名昭著的“linq to entity only supports...”:

无法将类型“Entities.Logging”转换为类型“Entities.ILogging”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

但我不知道为什么。我在Q 类上定义了我的泛型类型,所以运行时应该知道我正在处理Logging 而不是ILogging。有没有办法解决这个问题?

【问题讨论】:

  • Logging 类的初始定义怎么没有用关键字 partial 标记还是这里省略了
  • 我不知道这是否能解决您的问题,但在某个时间点,我记得必须将类添加到约束中。所以我有 where T 类,ILogging
  • 解决了,谢谢!

标签: c# entity-framework linq generics


【解决方案1】:

听起来像是 C# 编译器的错误或表达式树中的缺陷。

当约束为where T : ILoggingwhere T : struct, ILogging 时,生成的表达式为{l =&gt; (Convert(l).ID == 1)},即包含一个强制转换(注意Convert),这又会导致臭名昭著的EF 异常。

但是,设置 class 约束会删除强制转换,EF 很高兴:

where T : class, ILogging 导致{l =&gt; (l.ID == 1)}

【讨论】:

  • 类约束做到了
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多