我正在尝试将一些数据投影到POCO列表中,其中POCO包含另一种POCO的实例。
这两个类是Case和MyEntity,其中Case有一个名为Client的MyEntity实例。
public class Case
{
public int ID { get; set; }
public string CaseReference { get; set; }
public bool Deleted { get; set; }
public MyEntity Client { get; set; }
}
和
public class MyEntity
{
public int ID { get; set; }
public string Name { get; set; }
}
我正试图像这样查询它,但它报告失败“无法创建MyEntity类型的常量值”:
var result = (from c in context.cases
where c.case_ref.Contains(caseReference)
select new Case
{
ID = c.id,
CaseReference = c.case_ref,
Deleted = c.deleted,
Client = new MyEntity { ID = c.client.id, Name = c.client.name }
}).ToList();
这样做的最佳方法是什么,我是否必须将其分解为单独的查询?
答案 0 :(得分:1)
实体框架的IQueryable
实现在对象中创建新对象比在常规linq到对象(IEnumerable
)中更加挑剔。如果您首先通过ToList()将查询结果转换为IEnumerable
:
context.cases.Where(c => c.case_ref.Contains(caseReference).ToList()
然后,您可以按照自己的方式继续创建new Case
个对象。 (您可能需要Include()
中的context.cases
Case.Client。
答案 1 :(得分:1)
继Gert的回答之后,我想我会在查询表达式语法中为其他有这个问题的人发布答案。
请注意,我必须添加一些检查来处理客户端表中没有数据:
var result = (from c2 in ((from c1 in context.cases
where c1.case_ref.Contains(caseReference)
select c1).ToList())
select new Case
{
ID = c2.id,
CaseReference = c2.case_ref,
Deleted = c2.deleted,
Client = (c2.client_id != null ? new MyEntity { ID = c2.client.ID, Name = c2.client.name } : null)
}).ToList();