2012-01-17 22 views
6

Tôi có sauKhung thực thể - Không thể tạo giá trị không đổi loại x. Chỉ các kiểu nguyên thủy mới được hỗ trợ trong ngữ cảnh này.

Một kỹ sư mẫu:

public class engineers 
{ 
    public Guid? Guid { get; set; } 
    public string Name { get; set; } 
} 

tôi điền vào một danh sách các kỹ sư với các chi tiết chính xác:

List<engineers> listeng = new List<engineers>(); 
listeng.Add(new engineers { Name = profile.FirstName + " " + profile.LastName, Guid = GuidEngineer }); 

Cho đến nay rất tốt.

Câu hỏi của tôi làm thế nào tôi có thể kéo tên kỹ sư để mục eng dưới đây:

var tickets = from o in new HelpdeskEntities().Tickets.Where(t => t.TicketState.State == "Open") 
        select new AjaxTickets 
        { 
         TicketID = o.TicketID, 
         TicketSubject = o.TicketSubject, 
         ClientCompanyName = o.ClientCompany.ClientCompanyName, 
         DateOpened = o.DateOpened, 
         **eng** = list.Where(x => x.Guid == o.EngineerID).Select(x => new engineers {Guid = x.Guid, Name=x.Name }).FirstOrDefault().Name 

        }; 

Tôi cũng đã thử

var tickets = from o in new HelpdeskEntities().Tickets.Where(t => t.TicketState.State == "Open") 
        select new AjaxTickets 
        { 
         TicketID = o.TicketID, 
         TicketSubject = o.TicketSubject, 
         ClientCompanyName = o.ClientCompany.ClientCompanyName, 
         DateOpened = o.DateOpened, 
         **eng** = list.Where(x => x.Guid == o.EngineerID).Select(x => x.Name }).FirstOrDefault() 
        }; 

Các lỗi tôi nhận được là:

Unable to create a constant value of type 'Helpdesk2.ViewModel.engineers'. Only primitive types ('such as Int32, String, and Guid') are supported in this context."} 

Tôi rất hiểu nhưng không thể tìm ra chỉ để chọn tên kỹ sư.

Cảm ơn trước

+2

Bạn không thể sử dụng 'danh sách' trong truy vấn LINQ-to-entity. Chỉ có dữ liệu có sẵn trong cơ sở dữ liệu mới có thể được sử dụng. Bạn không thể tùy ý kết hợp linq-to-objects và linq-to-entity vì EF không biết cách dịch nó thành SQL. Sử dụng cách giải quyết của @ harriyott và điền vào 'Name' sau khi bạn tải vé từ cơ sở dữ liệu. –

Trả lời

3

Bạn sẽ có thể đơn giản hóa là người đầu tiên:

list.FirstOrDefault(x => x.Guid == o.EngineerID).Name 

Có nói rằng, Entity Framework có thể sẽ không cho phép bạn chạy mà khi chạy một cuộc gọi cơ sở dữ liệu. Nếu bạn có thể tạo khóa ngoài từ vé cho đến kỹ sư, bạn có thể chọn khóa đó theo cách giống như bạn làm tên công ty khách hàng. Nếu không, sau đó bạn sẽ cần phải làm điều đó trong hai đi: thứ nhất, chạy chọn mà không Populating tài sản tên kỹ sư, và sau đó, điền chúng với một cái gì đó như:

tickets.ForEach(ticket => ticket.EngineerName = engineers.First(eng => eng.Guid == ticket.EngineerID).Name) 

Rõ ràng bạn sẽ cần để thêm thuộc tính EngineerID và chọn nó trong bước đầu tiên.

+0

Các công việc xung quanh điền vào tên afterwords, không được điền đầy đủ vào tên. – user1153881

+0

Rất khó để kiểm tra chính xác những gì sẽ xảy ra mà không có mã thực tế và cơ sở dữ liệu để chạy nó chống lại (do đó tại sao tôi đã viết "một cái gì đó như"). Bạn đã thử thiết lập một điểm ngắt và kiểm tra những gì có trong 'vé' và' kỹ sư'? – harriyott

+0

OK, tôi phải gửi kết quả cho một biến thể mới sau đó thực hiện công việc xung quanh – user1153881

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