1

以下のコードをコンパイルできず、次のエラーが発生します。

LINQ to Entities does not recognize the method 'System.String ToString()

Linq2SQL ではできたのに Entity Framework ではできなかったので、少し驚いています。

以下のコードを書き直す手助けをしてもらえますか? このエラーに関連するいくつかの例を見てきましたが、このシナリオに固有のものは見つかりませんでした。ありがとう

 using (ctx)
 {
                   var productResults = (from q in ctx.Products
                                         where q.ProductId == productId && q.Model == productModel
                                         select new Models.ProductDTO
                                         {
                                             Id = q.ProductId,
                                             Name = q.Name.ToString(),
                                             Year = q.Year.ToString("MMM ddd d HH:mm yyyy"),
                                             Model = q.Model,
                                             Description = q.Description.ToString()
                                         }).Distinct().ToList().AsParallel();
                   Department.Products = productResults;
                }
4

2 に答える 2

1

最初にリストを取得しますcontext

var productResults = ctx.Products.where(q => q.ProductId == productId && q.Model == productModel).ToList();

次に、クエリを実行し、新しいタイプを次のように選択しますProductDTO

var productDTO = (from q in productResults 
                 select new Models.ProductDTO
                 {
                      Id = q.ProductId,
                      Name = q.Name.ToString(),
                      Year = q.Year.ToString("MMM ddd d HH:mm yyyy"),
                      Model = q.Model,
                      Description = q.Description.ToString()
                 }).Distinct().ToList().AsParallel();

コメントの後

IEnumerable:

IEnumerable<Products> list = context.Products.Take(10);
// after this line data load the memory that fetched from DB.

SQL 出力:

 Select * FROM Table

IQuerable:

IQuerable<Products> list = context.Products.Take(10);
// data still not fetch from DB

SQL 出力:

 Select Top 10 FROM Table
于 2013-02-12T13:50:46.937 に答える
1

これを 1 つのクエリで実行することもできます。

            var productResults = ctx.Products.Where(q => q.ProductId == productId && q.Model == productModel).ToList()
                .Select<Product, ProductDTO>(m =>
                {
                    Models.ProductDTO dto= new Models.ProductDTO();
                    dto.Id = m.ProductId;
                    dto.Name = m.Name.ToString();
                    dto.Year = m.Year.ToString("MMM ddd d HH:mm yyyy");
                    dto.Model = m.Model;
                    dto.Description = m.Description.ToString();
                    return dto;
                }).Distinct().ToList().AsParallel();

より良い方法があるかもしれませんが、それを 2 つのクエリに分割するとうまくいくかもしれません。

var productResults = (from q in ctx.Products
     where q.ProductId == productId && q.Model == productModel
     select q).ToList();

var temp = from o in productResults
         select new Models.ProductDTO
         {
             Id = q.ProductId,
             Name = q.Name.ToString(),
             Year = q.Year.ToString("MMM ddd d HH:mm yyyy"),
             Model = q.Model,
             Description = q.Description.ToString()
         }).Distinct().ToList();
于 2013-02-12T13:51:54.337 に答える