我是新來的LINQ。我需要運行聯接兩列(AnonymousUser.AnonymousId
是uniqueidentifier
和comment.UserId是nvarchar(100)
)查詢,類似如下:linq加入GUID和字符串列
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();
}
首先,我很高興與.ToString()
編寫查詢!事實證明,實體框架不知道如何將其轉換爲SQL。 Guid.Parse(string)
也是如此。另外new Guid(string)
不能在linq中用於實體(只允許無參數的構造函數)!
所以在搜索後,我發現在EF 4.0中做這種事情是不可能的!我將我的代碼遷移到一個存儲過程,我對此並不滿意。
是否有可能告訴實體框架在SQL中使用CAST
?
有沒有解決這個問題的方法?有什麼方法可以讓代碼中的邏輯?
注意:我打算在之一做一個GO。否則,一種可能的解決方案是從第一個表獲取實體,並將這些Id放入列表中,並從第二個表中獲取實體。
如果'comment.UserId'是一個GUID的字符串表示,那麼是否更容易將該列轉換爲唯一標識符?這可能是一個更好的解決方案,而不是讓實體框架在SQL中爲您執行此操作。 – mclark1129
不幸的是,它並不總是GUID。它可能是基於用戶類型的'Guid'或'int'。 – Ashkan
您是否嘗試使用['Guid.Parse(string)'](http://stackoverflow.com/a/8067647/484214)而不是'new Guid(string)'? –