C# Linq查找方法是可查询的
我的存储库中有这个,它可以按预期工作:C# Linq查找方法是可查询的,c#,linq,entity-framework,iqueryable,C#,Linq,Entity Framework,Iqueryable,我的存储库中有这个,它可以按预期工作: public virtual EntityClass GetById(int id) { return db.Set<EntityClass>().Find(id); } 如果计划将Id包括在列表中,请选择: var blah = myRepo.Select(s => new {column 2, column 3, column 7}).FirstOrDefault(s => s.Id == myId); 我将创建另一
public virtual EntityClass GetById(int id)
{
return db.Set<EntityClass>().Find(id);
}
如果计划将Id包括在列表中,请选择:
var blah = myRepo.Select(s => new {column 2, column 3, column 7}).FirstOrDefault(s => s.Id == myId);
我将创建另一个类,该类包含所需属性的子集。通过这种方式,您应该始终清楚您正在处理的是什么:
public class EntityClassLite
{
public int Id {get; set;}
public string Column2 {get; set;}
public string Column3 {get; set;}
public string Column7 {get; set;}
}
然后,您可以在存储库中有一个单独的方法:
public EntityClassLite GetLiteById(int id)
{
return db.Set<EntityClass>()
.All
.Where(e => e.Id = id)
.Select( new EntityClassLite
{
Column2 = e.Column2
Column3 = e.Column3
Column7 = e.Column7
}
.FirstOrDefault()
}
那么您将有两个存储库。一个用于EntityClass
,另一个用于EntityClassLite
,每个都有自己的Find
方法,并返回所需的数据
另一方面,我发现很难想象一个实体有如此大的列,以至于获取它的单个实例会导致严重的性能问题。好吧,我认为您应该重新考虑使用存储库(如果您使用的是EF),并将获取逻辑移到特定的方法中,比如
GetEmployeeById(int-id)
进入服务层
这里有一句话是关于如果您将存储库与实体框架一起使用会发生什么
您已经放弃了数据存储技术的所有功能,而选择了一种平淡、中性、低效的数据访问方式。-哈立德·阿布哈克梅
由于按主键进行查找搜索(因此只返回一个实体)-为什么需要
IQueryAble
返回值?从查找中获取IQueryAble不符合目的吗?“查找”通常用于避免访问数据库。您试图在这里优化什么?Find
有点特殊,因为它将首先检查StateManager
,然后再前往数据库(存储)查找对象,这意味着它可能被缓存,并且必须返回所有字段。如果您想要优化sql(例如,点击一个狭窄的索引而不是表),使用where和select投影,或者如果您想要使用Find
,您需要手动将整个实体映射到一个lite或anon类(但似乎没有什么意义,因为重用整个实体应该很便宜),我所需要的只是一种通过主键搜索表的方法(不知道表或pk名称,也不能够选择一定数量的属性(列)没有得到全部。Mikael,第一个默认值中的s只允许我访问匿名选择中选择的项目。这不是我需要的。感谢您尝试我写的想法,如果您没有在投影中包含Id,请使用第一个,如果您包含Id,请使用第二个。是的,对不起,我再次阅读了您的答案。但这将迫使我选择Id只是为了以后能够比较它。不是我想要的。不。如果你不想要Id,请使用第一个版本,在选择之前的where子句中进行过滤。如果我必须在存储库之外运行where子句,这会破坏进行回购的目的。我认为这将是一个棘手的问题问题是Find方法获取了应用程序中的所有列,这对性能有影响。
public class EntityClassLite
{
public int Id {get; set;}
public string Column2 {get; set;}
public string Column3 {get; set;}
public string Column7 {get; set;}
}
public EntityClassLite GetLiteById(int id)
{
return db.Set<EntityClass>()
.All
.Where(e => e.Id = id)
.Select( new EntityClassLite
{
Column2 = e.Column2
Column3 = e.Column3
Column7 = e.Column7
}
.FirstOrDefault()
}
public class EntityClass: EntityClassLite
{
public string Column1 {get; set;}
public string Column4 {get; set;}
public string Column5 {get; set;}
public string Column6 {get; set;}
public string Column8 {get; set;}
public string Column9 {get; set;}
public string Column10 {get; set;}
}