C# 实现通用查找<;T>;方法

C# 实现通用查找<;T>;方法,c#,asp.net,entity-framework,generics,dbcontext,C#,Asp.net,Entity Framework,Generics,Dbcontext,我正在为Add、Remove和Find实现泛型,因为我正在实现多租户,它允许我从数据库访问iQueryTables,而不是dbset Add的实施方式: 前代码: interest = db.Interests.Add(new Interest()) // Interests is dbSet 以下代码: interest = db.Add(new Interest()) // Interests is dbSet // in db class public T Add<T>(T

我正在为Add、Remove和Find实现泛型,因为我正在实现多租户,它允许我从数据库访问iQueryTables,而不是dbset

Add的实施方式:

前代码:

interest = db.Interests.Add(new Interest()) // Interests is dbSet
以下代码:

interest = db.Add(new Interest()) // Interests is dbSet

// in db class
public T Add<T>(T item) where T : class, ITenantData
    {
        var set = _appContext.Set<T>();
            return set.Add(item);
    }
var aptitude = db.Find(interest.AptitudeId); // how to identify type?
以下代码:

interest = db.Add(new Interest()) // Interests is dbSet

// in db class
public T Add<T>(T item) where T : class, ITenantData
    {
        var set = _appContext.Set<T>();
            return set.Add(item);
    }
var aptitude = db.Find(interest.AptitudeId); // how to identify type?
我不能这样做:

var aptitude = db.Aptitudes.Find(interest.AptitudeId);
因为天资现在是一个不可预测的因素

因此,这是目前的失败:

public T Find<T>(T query) where T : class, ITenantData
    {
        var set = _mentorContext.Set<T>();
        return set.Find(query);
    }
public T-Find(T-query),其中T:class,ITenantData
{
var set=_mentorContext.set();
返回set.Find(查询);
}
因为类型未识别-我得到:

类型“int”必须是引用类型才能用作 泛型类型或方法中的参数“T” 'App.Context.TenantContext.Find(T)'Service.cs


我对泛型有点陌生,这里的任何帮助都将不胜感激。

用扩展方法解决这个问题

public IQueryable<T> Query<T>() where T : class, ITenantData
{
    return _mentorContext.Set<T>().AsNoTracking();
}
…像这样使用它

var aptitude = db.Find<Aptitude>(interest.AptitudeId);
var-aptitude=db.Find(interest.AptitudeId);

。。。这就是说,使用
.Find
可能只会在对实体进行插入、更新和删除时(在某种类型的变异代码中)更快
.Find
将始终将实体附加到上下文,这是您需要更改数据时所需的。但是,不能对其调用
.AsNoTracking()
,因为它返回单个实体。如果只需要实体读取其属性或用于显示目的,
.AsNoTracking
将使整个实体图(实体及其导航/集合属性)与上下文分离,这可能比使用
.Find
更快。如果您以后想在变异代码中使用相同的实体实例,您可以将其附加到当时的上下文中。

为什么不能执行
db.Aptitudes.Find(interest.AptitudeId)?这似乎是目前为止最好的选择。为什么它是一个
IQueryable
意味着你不能使用它?@Servy-因为天分现在是一个IQueryable-根据这篇文章:仍然没有看到问题。调用
Find
不会改变
Aptitudes
的类型,也不会因为它是
IQueryable
而意味着您无法使用LINQ提供的方法找到该项。这里仍然没有看到问题。啊-出于性能原因,我尝试使用Find()而不是Where()。因此,请更改方法的类型以接受集合,而不是IQueryable,这里仍然没有看到问题。哇。这真是难以置信。谢谢你:)
public T Find<T>(params object[] keyComponents) where T : class, ITenantData
{
    return _mentorContext.Set<T>().Find(keyComponents);
}
var aptitude = db.Find<Aptitude>(interest.AptitudeId);