Vin*_*oni 0 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; }
public string SerialNumber { get; set; }
public string ProductToken { get; set; }
public Product Product { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
由于某些域名原因,产品和故障单在逻辑上是链接的,换句话说,它们没有链接在可由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()
};
Run Code Online (Sandbox Code Playgroud)
查询保持为IQueryble,因为在此之后,查询将继续使用过滤器进行优化.
问题是当我运行以下代码时:
var tickets = query.OrderBy(t => t.SerialNumber).ToList();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
"The entity or complex type 'Model.Ticket' cannot be constructed in a LINQ to Entities query."
Run Code Online (Sandbox Code Playgroud)
那么,我怎样才能实现目标呢?
您无法将结果投影到映射的实体,您可以将其投影为匿名类型,也可以创建自己的Ticket类型:
public class myTicket
{
public int Id { get; set; }
public string SerialNumber { get; set; }
public string ProductToken { get; set; }
public Product Product { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后:
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()
};
Run Code Online (Sandbox Code Playgroud)
您还需要使用DefaultIfEmpty()进行左外连接
| 归档时间: |
|
| 查看次数: |
1311 次 |
| 最近记录: |