将实体类型传递给泛型类的构造函数的好方法是什么,这样实体名称就可以在函数LINQ查询中使用



我使用的是MVC3, c#, Razor和EF 5。

我正在构建一个泛型类,可以在其构造函数(即"Order")中采用不同的实体,因此我的调用代码可能看起来像。我刚刚意识到,我只需要传递类型名称而不是对象实例,那么这会是什么样子呢:

ef_generic my_ef_generic = new ef_generic("Test",Order)

目前我的签名是这样的。这是错误的,因为我需要传入一个类型:

public ef_generic(string strName, object objEntity)

我需要在LINQ查询中访问这个"ObjEntity",即:

db.objEntity.Where (e => e.id = = myId)当代(). name>

后,我想使用objEntity的类型定义一个私有类型,到目前为止,我有:
    private List<object> _myRecords;
    public List<object> myRecords
    {

所以我想在一个显式的实体框架类型传递到一个通用类中使用,我问什么是一个好的方法。

许多谢谢。

最简单的方法是将类设置为泛型;请将下面的伪代码视为您可以根据自己的喜好进行更改的伪代码,而不是作为样式指南:)

public class ef_generic<T> where T : class, IHaveAnIdAndAName
{
    private List<T> _myRecords;          // Your internal List
    public IEnumerable<T> myRecords { 
      get { return _myRecords; } 
    }                                    // Public list getter
    private string _result;
    public ef_generic(string strName, IQueryable<T> objEntity)
    {
        const int myId = 4;
        _result = objEntity.First(e => e.Id == myId).Name;
        //...
    }
}

注意,你想要传递的实体类型(这里是TestEntity)需要一个Id和一个Name用于linq查询,所以它需要承诺使用接口IHaveAnIdAndAName来实现它;此外,正如Slauma在注释中指出的那样,它还需要有一个类约束。

public interface IHaveAnIdAndAName
{
    int Id { get; }
    string Name { get; }
}
public class TestEntity : IHaveAnIdAndAName { ...

当您想要实例化类时,从上下文传递给它IQueryable集合而不是类型名称(很难从类型名称猜出是哪个集合,所以另一种方法更容易)

Db db = GetDb();
var test = new ef_generic<TestEntity>("test", db.TestEntities);

最新更新