C# 当我试图使这个代码防错时,我会从演员身上获得多少表演上的成功?

C# 当我试图使这个代码防错时,我会从演员身上获得多少表演上的成功?,c#,linq,generics,casting,C#,Linq,Generics,Casting,我有以下代码: public class CrudModel<T> : ICrudModel<T> where T : DomainBase { public IQueryable<T> GetAll() { return Repository.Query<T>(); } } 因此,我可以用一种方法支持这两个用例。这似乎是可行的,但我正试图了解这样做会对我的表现造成什么样的影响 items.Cast<

我有以下代码:

public class CrudModel<T> : ICrudModel<T> where T : DomainBase
{
    public IQueryable<T> GetAll()
    {
        return Repository.Query<T>();
    }
}
因此,我可以用一种方法支持这两个用例。这似乎是可行的,但我正试图了解这样做会对我的表现造成什么样的影响

items.Cast<IFilterable>()).Cast<T>().AsQueryable()
items.Cast()).Cast().AsQueryable()
如果不好的话,我会记住从外部调用两个不同的方法,但是很明显,只调用一个方法会很方便。有什么建议吗


如果我忘了调用第二个方法,我想我会把它留作备份,但我想再次看看,如果可能的话,我是否可以将它保留为一个,以使外部调用程序更简单。

在CrudModel类中使用另一个带有where子句的方法如何

public IEnumerable<T> GetAll<T>(Func<T, bool> whereClause) where T : DomainBase
{
    var items = Repository.Query<T>();
    return items.Where(whereClause);
}
public IEnumerable GetAll(Func whereClause)其中T:DomainBase
{
var items=Repository.Query();
退货项目。在何处(第条);
}
并使用

List<int> intList = new List<int>() { 1 };
intList.GetAll<int>((i) => sampledict.ContainsKey(i));
List intList=newlist(){1};
intList.GetAll((i)=>sampledict.ContainsKey(i));

我觉得把逻辑限制在一个GetAll方法中使事情变得复杂是不合适的,因为CrudModel似乎是泛型的,所以最好让泛型方法接受任何条件

在CrudModel类中使用另一个带有where子句的方法怎么样

public IEnumerable<T> GetAll<T>(Func<T, bool> whereClause) where T : DomainBase
{
    var items = Repository.Query<T>();
    return items.Where(whereClause);
}
public IEnumerable GetAll(Func whereClause)其中T:DomainBase
{
var items=Repository.Query();
退货项目。在何处(第条);
}
并使用

List<int> intList = new List<int>() { 1 };
intList.GetAll<int>((i) => sampledict.ContainsKey(i));
List intList=newlist(){1};
intList.GetAll((i)=>sampledict.ContainsKey(i));

我觉得把逻辑限制在一个GetAll方法中使事情变得复杂是不合适的,因为CrudModel似乎是泛型的,所以最好让泛型方法接受任何条件

首先,我认为有一个函数GetAll有点奇怪,但对于某些类型,您开始过滤,导致无法获取全部:)

除此之外,我不认为你有很大的性能损失。。。本质上,你在你的内部做一个额外的检查
GetAll
-方法:
typeof(IFilterable)。IsAssignableFrom(typeof(T))
就像一个普通的演员。你几乎感觉不到


也许过滤器本身可以改进。你可以创建一本字典。字典是否在每次调用时都具有相同的值,还是会发生更改。如果只使用键而不使用值,为什么要使用字典?关于
哈希集如何?

首先,我认为有一个函数GetAll有点奇怪,但是对于某些类型,您开始过滤,导致无法获取全部:)

除此之外,我不认为你有很大的性能损失。。。本质上,你在你的内部做一个额外的检查
GetAll
-方法:
typeof(IFilterable)。IsAssignableFrom(typeof(T))
就像一个普通的演员。你几乎感觉不到


也许过滤器本身可以改进。你可以创建一本字典。字典是否在每次调用时都具有相同的值,还是会发生更改。如果只使用键而不使用值,为什么要使用字典?与数据库查询所花费的时间相比,
哈希集如何?

强制转换时间可以忽略。但是,您正在根据此处的代码查询整个表并在内存中进行筛选:

public IEnumerable<TResult> FilterwithinOrg<TResult>(IEnumerable<TResult> linked) where TResult :  IFilterable
{
    var dict = GetDict();
    return linked.Where(r => dict.ContainsKey(r.Id));
}
public IEnumerable FilterwithinOrg(IEnumerable链接),其中TResult:IFilterable
{
var dict=GetDict();
返回链接的。其中(r=>dict.ContainsKey(r.Id));
}
请记住,您需要过滤查询,而不是列表,因此您应该将方法更改为接受并返回
IQueryable
,例如:

public IQueryable<TResult> FilterwithinOrg<TResult>(IQueryable<TResult> linked) where TResult :  IFilterable
{
    var dictKeys = GetDict().Keys.ToList();
    return linked.Where(r => dictKeys.Contains(r.Id));
}
public IQueryable FilterwithinOrg(IQueryable链接),其中TResult:IFilterable
{
var dictKeys=GetDict().Keys.ToList();
返回linked.Where(r=>dictKeys.Contains(r.Id));
}

请注意,筛选器表达式必须具有等效的SQL表达式,否则将发生运行时错误

与数据库查询所花费的时间相比,可以忽略强制转换时间。但是,您正在根据此处的代码查询整个表并在内存中进行筛选:

public IEnumerable<TResult> FilterwithinOrg<TResult>(IEnumerable<TResult> linked) where TResult :  IFilterable
{
    var dict = GetDict();
    return linked.Where(r => dict.ContainsKey(r.Id));
}
public IEnumerable FilterwithinOrg(IEnumerable链接),其中TResult:IFilterable
{
var dict=GetDict();
返回链接的。其中(r=>dict.ContainsKey(r.Id));
}
请记住,您需要过滤查询,而不是列表,因此您应该将方法更改为接受并返回
IQueryable
,例如:

public IQueryable<TResult> FilterwithinOrg<TResult>(IQueryable<TResult> linked) where TResult :  IFilterable
{
    var dictKeys = GetDict().Keys.ToList();
    return linked.Where(r => dictKeys.Contains(r.Id));
}
public IQueryable FilterwithinOrg(IQueryable链接),其中TResult:IFilterable
{
var dictKeys=GetDict().Keys.ToList();
返回linked.Where(r=>dictKeys.Contains(r.Id));
}

请注意,筛选器表达式必须具有等效的SQL表达式,否则将发生运行时错误

使用探查器确定性能命中率。它为您提供正确的信息。使用探查器确定性能命中率。它提供了正确的信息。GetDict()从缓存中获取值,因此不必担心。Hashset真的那么快吗。我读到的大部分东西都说same@Leora. 正确:两者速度相同。但是字典(键和值)比哈希集(仅键)消耗更多的内存。GetDict()从缓存中获取值,因此不必担心。Hashset真的那么快吗。我读到的大部分东西都说same@Leora. 正确:两者速度相同。但是字典(键和值)比哈希集(只有键)消耗更多的内存。我理解你的观点,但是如果我要这样做,调用方需要知道如何在这里按组织过滤。我不想让调用方知道这个实现,也不想访问Dict()缓存,因为我想要集中(它会被多次调用)在这种情况下,我将创建一个使用dictionary并调用GetAll的扩展方法。若你们将来有其他的过滤器,你们会再次修改getall方法。同样,我理解你们的观点,但这是一个特定的过滤器。我正在分享这个故事