2013-08-14 32 views
31

Tôi đang làm việc với MVC 4 và tôi phải cập nhật cơ sở dữ liệu của mình bằng Code First Migrations. Những gì tôi đang cố gắng làm là chọn các bản ghi từ một bảng cơ sở dữ liệu và chèn chúng vào một danh sách thả xuống nơi người dùng có thể chọn một bản ghi.LINQ to Entities không nhận ra phương thức 'System.String ToString()' trong MVC 4

Tôi có một lỗi mà tôi không hiểu:

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

Bộ điều khiển:

public ActionResult Addnew() 
     { 
      var dba = new DefaultConnection(); 
      var query = dba.blob.Select(c => new SelectListItem 
      { 
       Value = c.id.ToString(), 
       Text = c.name_company, 
       Selected = c.id.Equals(3) 
      }); 
      var model = new Companylist 
      { 
       xpto = query.AsEnumerable() 
      }; 

      return View(model); 
     } 
+6

[câu trả lời này] (http://stackoverflow.com/questions/1066760/problem-with-converting-int-to-string-in-linq-to-entities) nên sửa chữa ya – Jonesopolis

+0

hoặc chỉ sử dụng LinqToObjects thay thế. –

+0

giải quyết !! cảm ơn bạn rất nhiều – user2232273

Trả lời

57

Bạn đã nhận lỗi này vì Entity Framework không biết làm thế nào để thực hiện phương pháp .ToString() trong sql. Vì vậy, bạn nên tải các dữ liệu bằng cách sử dụng ToList và sau đó chuyển thành SelectListItem như:

var query = dba.blob.ToList().Select(c => new SelectListItem 
    { 
    Value = c.id.ToString(), 
    Text = c.name_company, 
    Selected = c.id.Equals(3) 
}); 

Chỉnh sửa: Để làm cho nó rõ ràng hơn, khuôn khổ Entity chuyển đổi sử dụng các toán tử truy vấn như Select, Where ETC vào một truy vấn sql để tải dữ liệu. Nếu bạn gọi một phương thức như ToString(), mà Entity Framework không có tương đương trong sql, nó sẽ khiếu nại. SO ý tưởng là trì hoãn việc sử dụng các chức năng tải dữ liệu như vậy. ToList, ToArray Thực thi lực lượng ETC của truy vấn, do đó tải dữ liệu. Khi dữ liệu được tải, bất kỳ thao tác nào khác (chẳng hạn như Select, Where ETC) được thực hiện bằng cách sử dụng LINQ to Objects, trên dữ liệu đã có trong bộ nhớ.

+1

đã thử phiên bản của bạn và nó hoạt động quá.Cảm ơn bạn rất nhiều – user2232273

+52

Vấn đề chính với cách tiếp cận này, nếu bạn chọn từ một bảng có hàng nghìn hoặc hàng chục nghìn bản ghi - ToList sẽ kéo tất cả xuống từ cơ sở dữ liệu vào đối tượng, sau đó bạn chọn một đối tượng khác . Không hiệu quả cao - tốt hơn để sử dụng SqlFunctions: Value = SqlFunctions.StringConvert (c.id) –

+0

Giải thích tuyệt vời cả VarunK và NaytGrochowski –

2

gì nếu ... bạn sử dụng:

Value = c.id + "", 

thay vì

Value = c.id.ToString(), 

Sửa

Với tùy chọn này, bạn không phải lấy tất cả dữ liệu từ cơ sở dữ liệu

0

chỉ cần sử dụng đại biểu:

var query = dba.blob.Select(delegate(blob c) 
{ 
    return new SelectListItem 
     { 
      Value = c.id.ToString(), 
      Text = c.name_company, 
      Selected = c.id.Equals(3) 
     }; 
}); 
0

Sau đây là cách tôi thực hiện để hiển thị dưới dạng danh sách lựa chọn.

public List<BlobEntity> GetBlobs() 
    { 
     List<BlobEntity> blobs = null; 
     using (var db = new MyDBEntities()) 
     { 
      blobs = (from b in db.blobs 
        where b.id > 0 //Example filter 
        select new BlobEntity 
        { 
         ID = b.id, 
         CompanyName = b.name_company 
        } 
        ).ToList(); 

     } 
     return blobs; 
    } 

    public static SelectList GetBlobsSelectList() 
    { 
     MyBL theBL = new MyBL(); 
     List<BlobEntity> blobEntites = theBL.GetBlobs(); 
     var listItems = blobEntites 
      .Select(x => new SelectListItem { Text = x.CompanyName, 
               Value = x.ID.ToString() 
              }) 
      .ToList(); 
     SelectList blobsSelectList = new SelectList(listItems.AsEnumerable(), "Value", "Text"); 
     return blobsSelectList; 
    } 

    public class BlobEntity 
    { 
     public int ID { get; set; } 
     public string CompanyName { get; set; } 
    } 

Câu trả lời được chấp nhận hiện tại (bởi @VarunK) là không sao nếu bạn chọn tất cả bản ghi và tất cả các cột. Tuy nhiên, nếu không phải như vậy, tốt nhất bạn nên thực hiện phép chiếu với các cột và bản ghi bắt buộc trước khi áp dụng ToList().

Hãy xem Why LINQ to Entities does not recognize the method 'System.String ToString()?.

tài liệu tham khảo khác: Problem with converting int to string in Linq to entities

Các vấn đề liên quan