Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按名称检索实体对象-LINQ到实体,EF 4.0_Linq_Ef4 Code Only - Fatal编程技术网

按名称检索实体对象-LINQ到实体,EF 4.0

按名称检索实体对象-LINQ到实体,EF 4.0,linq,ef4-code-only,Linq,Ef4 Code Only,我有许多结构相同但命名约定不同的实体对象,例如Products1、Products2、Products3(这是遗留数据库模式的一部分,对此我无能为力) 就CLR而言,这些类是不同类型的,不幸的是,由于设计代码是自动生成的,我不能在这些家伙身上加一个接口来显示通用性。所以,我的问题是:有没有办法按名称检索实体对象 在对这些对象应用基本相同的逻辑时,我基本上希望避免切换/案例业务。根据我们讨论的类的数量以及您需要的灵活性,接口可能不是不可能的。我使用泛型做过类似的事情: //WARNING: Par

我有许多结构相同但命名约定不同的实体对象,例如Products1、Products2、Products3(这是遗留数据库模式的一部分,对此我无能为力)

就CLR而言,这些类是不同类型的,不幸的是,由于设计代码是自动生成的,我不能在这些家伙身上加一个接口来显示通用性。所以,我的问题是:有没有办法按名称检索实体对象


在对这些对象应用基本相同的逻辑时,我基本上希望避免切换/案例业务。

根据我们讨论的类的数量以及您需要的灵活性,接口可能不是不可能的。我使用泛型做过类似的事情:

//WARNING: Partially-remembered code ahead...
interface IDuckEntity
{
    int FeatherCount { get; set; }
}

public partial class Products1 : IDuckEntity { }
public partial class Products2 : IDuckEntity { }
public partial class Products3 : IDuckEntity { }

//in some other class:
void DoStuff<T>(T entity) where T : EntityObject, IDuckEntity
{
     entity.FeatherCount = 500;
}
//警告:前面部分记住了代码。。。
接口不一致性
{
int FeatherCount{get;set;}
}
公共部分类产品1:IDuckEntity{}
公共部分类产品2:IDuckEntity{}
公共部分类产品3:IDuckEntity{}
//在其他类别中:
void DoStuff(T entity),其中T:EntityObject,iduckenty
{
entity.FeatherCount=500;
}

因此,基本上,您设置了一个单独的文件,在其中放置接口和一堆小的分部类声明。然后您就可以访问公共结构。我不知道你的具体情况是什么,但这对我来说很有吸引力。

因为EF4类是部分类,你可以扩展它们,让它们实现你选择的接口,所有这些都在一个单独的文件中

另一种方法是使用-仅根据实体的类型实例化实体

dynamic myEntity= Activator.CreateInstance(Type.GetType("EntityTypeHere")));
myEntity.CommonProperty = "Foo";

这里最大的缺点是在编译时会失去所有类型安全性—任何问题都只能在运行时发现,而且比静态类型方法慢。

您可以构建表达式树来查询有问题的一个或多个对象:

public T GetSingleObject<T>(int someValue) {
    MyEntities db = new MyEntities();
    var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s"));

    var param = Expression.Parameter(typeof(T));

    var lambda = Expression.Lambda<Func<T, bool>>(
        Expression.Equal(
            Expression.Property(param, "WhateverPropertyYourComparing"),
            Expression.Constant(someValue)),
        param);

    return result.SingleOrDefault(lambda);
}
public T GetSingleObject(int-someValue){
MyEntities db=新的MyEntities();
var result=db.CreateQuery(String.Format(“[{0}]”),typeof(T.Name+“s”);
var param=表达式参数(typeof(T));
var lambda=表达式.lambda(
表达式。相等(
Expression.Property(参数“WhateverPropertyYourComparing”),
表达式.常量(someValue)),
参数);
返回结果。SingleOrDefault(λ);
}
或者如果你想要一个对象的集合

public IEnumerable<T> GetResultCollection<T>(int someValue) {
    MyEntities db = new MyEntities();
    var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s"));

    var param = Expression.Parameter(typeof(T));

    var lambda = Expression.Lambda<Func<T, bool>>(
        Expression.Equal(
            Expression.Property(param, "WhateverPropertyYourComparing"),
            Expression.Constant(someValue)),
        param);

    return result.Where(lambda);
}
public IEnumerable GetResultCollection(int-someValue){
MyEntities db=新的MyEntities();
var result=db.CreateQuery(String.Format(“[{0}]”),typeof(T.Name+“s”);
var param=表达式参数(typeof(T));
var lambda=表达式.lambda(
表达式。相等(
Expression.Property(参数“WhateverPropertyYourComparing”),
表达式.常量(someValue)),
参数);
返回结果。其中(λ);
}

当然,如果您所期望的查询很长,这可能会失控,您应该考虑使用部分类添加必要的接口,如Justin Morgan建议的。 请注意,此方法假定ObjectSet集合与对象同名,并加上一个“s”,即“发票”到“发票”。如果情况并非如此,即“Person”到“People”,那么您可以使用System.Data.Entity.Design.PluralizationServices.PluralizationService来获得正确的名称