0

データベースの 2 つのテーブルをマップする 2 つのクラスがあります。

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 によってマップできるデータベース関係でリンクされていません。 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()
                          };

その後、クエリはフィルターで絞り込まれ続けるため、クエリは IQueryble として保持されます。

問題は、次のコードを実行するときです。

var tickets = query.OrderBy(t => t.SerialNumber).ToList();

次のエラーが発生しました。

"The entity or complex type 'Model.Ticket' cannot be constructed in a LINQ to Entities query."

では、どうすれば目標を達成できるでしょうか?

4

1 に答える 1

5

結果をマッピングされたエンティティに射影することはできません。匿名型に射影するか、次のような独自のチケット タイプを作成することができます。

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()
                          };

また、左外部結合にはDefaultIfEmpty()を使用する必要があります

于 2012-04-17T16:59:29.753 に答える