【发布时间】:2014-06-27 10:59:37
【问题描述】:
首先,让我说我已经研究过这个问题并阅读了以下堆栈溢出文章,但它们都没有真正解决这种情况。
情况
我有两节课
public class Section{
public string SchoolId{get;set;}
public string CourseId{get;set;}
public string SectionId{get;set;}
}
public class RelatedItem{
public string SchoolId{get;set;}
public string CourseId{get;set;}
public string SectionId{get;set;}
//..
}
我有一个来自一个来源的Section 数组,是一个实际的对象集合。
RelatedItem 我正在通过针对 DbContext 的 LINQ to Entities 调用。
我的目标是根据我从其他来源获得的部分获取所有相关项。
我正在写这样的查询
Section[] mySections = GetSections(); //Third Party Source
IQueryable<RelatedItem> relatedItems = DbContext.RelatedItems
.Where(r=>
mySections.Any(s=> s.SchoolId == r.SchoolId &&
s.CourseId == r.CourseId &&
s.SectionId == r.SectionId)
);
问题
在运行时,我收到以下错误
无法创建类型的常量值 '项目命名空间.Section'。只有原始类型或 在此上下文中支持枚举类型。
我找到了解决方法,但它涉及执行以下操作,但它没有利用我的任何表索引。
var sectionIds = sections.Select(s=>string.Concat(s.SchoolId, "|",s.CourseId, "|",s.SectionId));
IQueryable<RelatedItem> relatedItems = DbContext.RelatedItems
.Where(r=>
sectionIds.Contains(string.Concat(r.SchoolId, "|",r.CourseId, "|",r.SectionId))
);
这段代码有效,目前速度非常快(但这是开发,我的记录数很少)。除了将我的相关项目转换为内存中的集合之外,还有其他建议吗?
【问题讨论】:
-
尝试添加 ToList() DbContext.RelatedItems.ToList().Where(r=> 告诉我进展如何。
-
一个建议更改数据库方案并添加代理 PK 而不是复合。
-
@LIUFA,您是否建议将整个数据库表(可能是 100 万行)加载到内存集合中?
-
@HamletHakobyan 这只是一个测试,下一步是实现 IEquitable
标签: c# sql linq entity-framework-6