2012-08-26 26 views
5

Tôi mới tham gia LINQ. Tôi cần phải chạy một truy vấn mà tham gia hai cột (AnonymousUser.AnonymousIduniqueidentifier và comment.UserId là nvarchar(100)), một cái gì đó như dưới đây:linq tham gia vào guid và cột chuỗi

 using (CommentEntities db = new CommentEntities()) 
     { 
      // filteredComments is a query that is not run until the next .ToList() 
      IQueryable<Comment> filteredComments = this.CommentGetList(...); 
      var query = from comment in filteredComments 
         // following line is the syntax error, because columns' types don't match 
         join user in db.AnonymousUsers on comment.UserId equals user.AnonymousId into gj 
         from userNull in gj.DefaultIfEmpty() 
         select new CommentWithName 
         { 
          Comment = comment, 
          UserId = comment.UserId, 
          FirstName = (userNull == null ? "" : userNull.Name), 
          LastName = "", 
          Email = (userNull == null ? "" : userNull.Email) 
         }; 
      return query.ToList(); 
     } 

Đầu tiên tôi đã hạnh phúc bằng văn bản cho truy vấn với .ToString()! Như nó chỉ ra rằng khuôn khổ thực thể không biết làm thế nào để dịch nó để sql. Điều này cũng đúng cho Guid.Parse(string). Ngoài ra new Guid(string) không thể được sử dụng trong LINQ cho các thực thể (chỉ cho phép các nhà thầu không tham số)!

Vì vậy, sau khi tìm kiếm, tôi phát hiện ra rằng không thể thực hiện điều đó trong EF 4.0! Tôi đã chuyển mã của mình sang một thủ tục đã lưu trữ mà tôi không thực sự hài lòng về nó.

Có thể nói khuôn khổ pháp nhân sử dụng CAST trong SQL không?

Có giải pháp nào cho vấn đề này không? Có cách nào mà tôi có thể mang lại logic trong mã?

LƯU Ý: Tôi muốn làm điều đó trong một GO. Nếu không, một giải pháp có thể là lấy các thực thể từ bảng đầu tiên và đặt các Id trong danh sách và nhận các thực thể từ bảng thứ hai.

+0

Nếu 'comment.UserId' là biểu diễn chuỗi của GUID, liệu có dễ dàng hơn khi chuyển cột đó thành một số nhận dạng duy nhất không? Nó có thể là một giải pháp tốt hơn là có Entity Framework cố gắng thực hiện việc này cho bạn trong SQL. – mclark1129

+0

Thật không may nó không phải luôn luôn GUID. Nó có thể là 'Guid' hoặc' int', dựa trên kiểu người dùng. – Ashkan

+0

Bạn đã thử sử dụng ['Guid.Parse (string)'] (http://stackoverflow.com/a/8067647/484214) thay vì 'new Guid (string)'? –

Trả lời

0

gọi toList() trước khi áp dụng các phương pháp đó. Giống như:

var Product = db.Products.Where(p => p.ProductId == Guid.Parse("B4E913F9-166C-49BA-AADE-6DB889D1756F")).Single(); 

sẽ ném một

C# LINQ to Entities không nhận ra phương pháp "System.Guid Parse" (System.String)' phương pháp, và phương pháp này không thể được dịch sang một cửa hàng biểu

Nhưng công trình này:

var Product = db.Products.ToList().Where(p => p.ProductId == Guid.Parse("B4E913F9-166C-49BA-AADE-6DB889D1756F")).Single() 

ps: tôi nghĩ bạn sẽ bị mất tải, nhưng bạn có thể làm háo hức với .Bao gồm trước khi gọi .ToList().

+0

nó sẽ là một ý tưởng tốt để sử dụng tải háo hức nếu nó áp dụng cho hai bảng mà không có một mối quan hệ. P.S: không có mối quan hệ nào giữa các bảng Comment và AnonymousUser – Ashkan

+2

Bạn sẽ kết thúc việc kéo toàn bộ danh sách của mình vào bộ nhớ bằng tùy chọn này. Chỉ làm điều này nếu bảng sản phẩm nhỏ. –

+0

Không có bảng nhận xét nào là một bảng rất lớn ... – Ashkan

0

Nếu bạn list là danh sách đối tượng bạn có thể chuyển nó sang loại đã GUID như nhận dạng, đầu tiên tạo ra loại vô danh mới và sau đó lọc nó dựa trên UserId, chắc chắn UserId đó là loại int, sẽ không bao gồm trong tham gia:

 int output = 0; 

    var secondList = list.Where(x=>!int.TryParse(x.UserID, out output)) 
        .Select(x=>new {Comment = x, ID = new Guid(x.UserID)) 
        .ToList(); 

Bây giờ bạn có thể chạy truy vấn của mình trên db bằng cách sử dụng secondList.

+0

Tôi không đề cập rằng 'danh sách' thuộc loại' IQueryable '. – Ashkan

+1

Vì vậy, bạn có nghĩa là nó là một mục db, trong trường hợp này tôi muốn cung cấp để sử dụng thủ tục được lưu trữ. –

+0

+1. Sau đó, bạn đồng ý không có cách nào làm điều này bởi EF? còn các phiên bản mới hơn của EF thì sao? – Ashkan

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