C# Linq到实体中的左外部联接(不能在Linq到实体查询中构造实体或复杂类型。)
我有两个类映射数据库的两个表:C# Linq到实体中的左外部联接(不能在Linq到实体查询中构造实体或复杂类型。),c#,linq,linq-to-entities,outer-join,C#,Linq,Linq To Entities,Outer Join,我有两个类映射数据库的两个表: public class Product { public int Id { get; set; } public string Token { get; set; } public string Name { get; set; } public decimal Value { get; set; } } public class Ticket { public int Id { get; set; } publ
public class Product
{
public int Id { get; set; }
public string Token { get; set; }
public string Name { get; set; }
public decimal Value { get; set; }
}
public class Ticket
{
public int Id { get; set; }
public string SerialNumber { get; set; }
public string ProductToken { get; set; }
public Product Product { get; set; }
}
由于某些域的原因,产品和票证在逻辑上是链接的,换句话说,它们不在EF可以映射的数据库关系中链接,它们将在我的应用程序中与linq查询链接,该查询“必须”在SQL外部左连接中翻译。由此,我进行了以下查询:
IQueryble<Ticket> query = from ts in context.Tickets
join ps in context.Products
on ts.ProductToken equals ps.Token into p
select new Ticket
{
Id = t.Id,
SerialNumber = t.SerialNumber,
ProductToken = t.ProductToken,
Goal -----> Product = p.FirstOrDefault()
};
我得到了以下错误:
"The entity or complex type 'Model.Ticket' cannot be constructed in a LINQ to Entities query."
那么,如何实现我的目标呢?您不能将结果投影到映射的实体,您可以将其投影到注释类型,或者创建自己的票证类型,例如:
public class myTicket
{
public int Id { get; set; }
public string SerialNumber { get; set; }
public string ProductToken { get; set; }
public Product Product { get; set; }
}
然后:
IQueryble<myTicket> query = from ts in context.Tickets
join ps in context.Products
on t.ProductToken equals p.Token into p
select new myTicket
{
Id = t.Id,
SerialNumber = t.SerialNumber,
ProductToken = t.ProductToken,
Product = p.FirstOrDefault()
};
IQueryble query=来自context.Tickets中的ts
在context.Products中加入ps
关于t.ProductToken等于p.Token到p
选择新的myTicket
{
Id=t.Id,
SerialNumber=t.SerialNumber,
ProductToken=t.ProductToken,
Product=p.FirstOrDefault()
};
此外,您还需要使用“左外部联接”无法将结果投影到映射的实体,您可以将其投影到注释性类型或创建自己的票证类型,例如:
public class myTicket
{
public int Id { get; set; }
public string SerialNumber { get; set; }
public string ProductToken { get; set; }
public Product Product { get; set; }
}
然后:
IQueryble<myTicket> query = from ts in context.Tickets
join ps in context.Products
on t.ProductToken equals p.Token into p
select new myTicket
{
Id = t.Id,
SerialNumber = t.SerialNumber,
ProductToken = t.ProductToken,
Product = p.FirstOrDefault()
};
IQueryble query=来自context.Tickets中的ts
在context.Products中加入ps
关于t.ProductToken等于p.Token到p
选择新的myTicket
{
Id=t.Id,
SerialNumber=t.SerialNumber,
ProductToken=t.ProductToken,
Product=p.FirstOrDefault()
};
您还需要使用左外联接做得很好,只是注意您按序列号错过了订单:)我不明白为什么我必须创建一个与POCO类相同的新类,如果您在选择返回中创建一个
新的myTicket
,为什么iQueryTable保持相同(Ticket),它将运行,需要一些cast吗?@ViniciusOttoni,IQueryable是一个输入错误,应该是myTicket,您无法投影到映射实体的原因是一个实体表示一个数据库表。使用project时,您正在选择该表的一部分(某些列),该部分数据的状态无效无法选择部分数据并继续使用主查询进行另一次查询?@ViniciusOttoni,在您的情况下,我不知道是否有,我很想知道ThoughtGood work,我不明白为什么我必须创建一个与POCO类相同的新类,如果你在选择返回中创建一个新的myTicket
,为什么iQueryTable保持不变(Ticket),它将运行,需要一些演员?@ViniciusOttoni,IQueryable是一个打字错误,应该是myTicket,无法投影到映射实体的原因是,实体正在表示数据库表。使用project时,您正在选择该表的一部分(某些列),该部分数据的状态无效无法选择部分数据并继续使用主查询进行另一次查询?@ViniciusOttoni,在您的情况下,我不知道是否有,但我很想知道