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.AnonymousId
là uniqueidentifier
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.
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
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
Bạn đã thử sử dụng ['Guid.Parse (string)'] (http://stackoverflow.com/a/8067647/484214) thay vì 'new Guid (string)'? –