Nó làm cho không có ý nghĩa với tôi lý do tại sao Linq2EF không dịch .ToString()
thành một SQL thích hợp tuyên bố, như Linq2SQL, chỉ có đội ngũ dev của Microsoft biết lý do tại sao họ chưa triển khai nó. :-(
Nhưng bạn có thể nâng cao ưu tiên để thực hiện nó nếu bạn bỏ phiếu cho tính năng này bằng cách làm theothis link.
May mắn cũng có 2 cách giải quyết có sẵn, cả hai chúng tôi đã sử dụng gần đây trong truy vấn EF:
I) gì giúp tôi để có được khắc phục hạn chế này là để thay đổi truy vấn vào một danh sách, như vậy:
var customersList = (from c in db.Customers
select c).ToList(); // converts to IEnumerable<T> ...
var customersTest = (from c in customersList
select new {Id=c.ID.ToString()}); // ... which allows to use .ToString()
Tuyên bố .ToList()
cải để IEnumerable<T>
, nơi .ToString()
có sẵn. Lưu ý, Tùy thuộc vào yêu cầu, bạn có thể sử dụng .AsEnumerable()
, có lợi thế là trì hoãn thực thi được hỗ trợ tốt hơn nếu bạn có nhiều truy vấn LINQ tùy thuộc lẫn nhau hoặc nếu bạn đang sử dụng các giá trị tham số khác nhau (nhiều nhờ có Divega cho gợi ý này!).
Sau đó bạn có thể sử dụng truy vấn này như bạn muốn, ví dụ .:
var customersTest2 = from c in customersTest
select new
{
Id = c.Id,
Addresses = from a in db.Addresses where c.Id == a.ReferenzId select a
};
Tất nhiên nếu bạn cần bạn có thể thêm nhiều thuộc tính cho các đối tượng của customersTest
theo yêu cầu. Bạn cũng có thể tối ưu hóa truy vấn ở trên, tôi chỉ sử dụng 3 bước để dễ đọc ví dụ này.
II) Đối với chuyển đổi đơn giản, và nếu bạn có để tái sử dụng các truy vấn được tạo ra trong truy vấn con hơn nữa (và nó cần phải duy trì IQueryable
), sử dụng SqlFunctions
từ System.Data.Objects.SqlClient
, họ sẽ được dịch sang các truy vấn SQL một cách chính xác.
Ví dụ 1: Ngày chuyển đổi (bạn phải sử dụng dateparts như dưới đây thể hiện)
var customersTest = from c in db.Customers
select new {
strDate=SqlFunctions.DateName("dd", c.EndDate)
+"."+SqlFunctions.DateName("mm", c.EndDate)
+"."+SqlFunctions.DateName("yyyy", c.EndDate)
}
Ví dụ 2: Numeric để chuyển đổi chuỗi
var customersTest = from c in db.Customers
select new {
strID=SqlFunctions.StringConvert((double)c.ID)
}
Điều này sẽ giúp bạn ra khỏi hầu hết các tình huống mà yêu cầu chuyển đổi thành chuỗi.
Cập nhật: Nếu bạn làm theo các liên kết Tôi đưa cho bạn ở phần đầu của câu trả lời của tôi, tính năng này mất tích đã đồng thời nhận 75 phiếu và bây giờ là implemented by Microsoft in EF 6.1 (cuối cùng!). Để tất cả những người tham gia: Cảm ơn bạn đã bỏ phiếu! Giọng của bạn đã được nghe.
Ví dụ:
var query = from e in context.Employees where e.EmployeeID.ToString() == "1" select e;
bây giờ sẽ được dịch sang:
DECLARE @p0 NVarChar(1000) = '1'
SELECT [t0].[EmployeeID], [t0].[LastName], [t0].[FirstName], [t0].[Title],
[t0].[TitleOfCourtesy], [t0].[BirthDate], [t0].[HireDate], [t0].[Address],[t0].[City],
[t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[HomePhone], [t0].[Extension],
[t0].[Photo], [t0].[Notes], [t0].[ReportsTo], [t0].[PhotoPath]
FROM [Employees] AS [t0]
WHERE (CONVERT(NVarChar,[t0].[EmployeeID])) = @p0
ví dụ: e.EmployeeID.ToString()
dịch để (CONVERT(NVarChar,[t0].[EmployeeID]))
.
Id của bạn đã là một chuỗi chưa? Không chắc chắn lý do tại sao điều đó sẽ khiến EF trở thành vấn đề nhưng thông báo lỗi dường như chỉ ra rằng đó là một trở ngại. Bạn muốn string.ToString() sẽ hoạt động khá nhanh: P –
Id là một số nguyên trong ví dụ L2S. Trong ví dụ EF thực sự của chúng tôi nó là một GUID. Thú vị ToString() là intellisense và nó biên dịch nhưng nhận được lỗi thời gian chạy. –
@Edward Tanguay: Tôi vừa xem câu hỏi của bạn và thêm một câu trả lời, tôi hy vọng nó vẫn hữu ích ngay cả sau một thời gian dài ... – Matt