后尖锐方面:访问“注入”;属性在实体框架LINQ查询

本文关键字:属性 实体 框架 查询 LINQ 注入 方面 访问 | 更新日期: 2023-09-27 18:19:17

我使用PostSharp方面将属性"注入"到一些类中,这些类将通过实体框架存储在DB中(代码优先)。稍后,我想在查询中查询和访问每个类的注入属性。例如,假设我正在编写一个将"id"属性注入对象的方面:

interface IIdentifyable
{
    string id { get; set; }
}
[IntroduceInterface(typeof(IIdentifyable))]
[Serializable]
public class IdentifiableAspect : InstanceLevelAspect, IIdentifyable
{
    [Key]
    [IntroduceMember]
    public virtual string id { get; set; }
    public override void RuntimeInitializeInstance()
    {
        id = Guid.NewGuid().ToString();
        base.RuntimeInitializeInstance();
    }
}
[Serializable]
[IdentifiableAspect]
public class Car
{
  // ...
}

现在我想在实体框架linq查询中使用Car类的"注入"id属性。例如,我想计算id包含数字1的所有汽车。我尝试了几种方法,但都不起作用:

// Throws exception
// LINQ to Entities does not recognize the method IIdentifyable Cast[Car,IIdentifyable](car) method, and this method cannot be translated into a store expression.
dbContext.cars.Where(car => Post.Cast<Car, IIdentifyable>(car).id.Contains("1")).Count();
// Throws exception
// IIdentifyable is not a valid metadata type for type filtering operations. Type filtering is only valid on entity types and complex types.
dbContext.cars.OfType<IIdentifyable>().Where(car => car.id.Contains("1")).Count();
// Throws exception
// Unable to cast the type Car to type IIdentifyable. LINQ to Entities only supports casting EDM primitives or enumeration types.
dbContext.cars.Where(car => ((IIdentifyable)car).id.Contains("1")).Count();

是否有任何方法可以做到这一点,或者根本没有办法将PostSharp与EF结合使用?

谢谢。

后尖锐方面:访问“注入”;属性在实体框架LINQ查询

我不确定您的项目设置,但我会假设所有内容都在同一个项目中:

您需要在单独的程序集中定义您的类。我不认为你可以在应用aspect的同一个项目中使用注入属性,因为我相信PostSharp是在编译后发生的。你需要在一个新的项目中做Linq的工作,这个项目将引用编译后的输出。

E.x。project <——在这里定义你的方面project——在这里定义你的类。让它引用ProjectA——在这里定义你的linq查询

你的另一个选择是使用动态关键字,而失去编译类型检查。