是什麼導致Linq錯誤:此方法無法轉換為商店表達式?

.net c# entity-framework linq

我有一堆Linq to Entity方法具有相同的select語句,所以我認為我會聰明並將其分離到它自己的方法來減少冗餘......但是當我試圖運行代碼時,我得到了以下內容錯誤...

此方法無法轉換為商店表達式

這是我創建的方法......

public User GetUser(DbUser user, long uid)
{
    return new User
    {
        Uid = user.uid,
        FirstName = user.first_name,
        LastName = user.last_name
    };
}

我打電話給這樣的方法......

public User GetUser(long uid)
{
    using (var entities = new myEntities()) {
        return
            entities.DbUsers.Where( x => x.uid == uid && x.account_status == ( short )AccountStatus.Active ).
                Select( x => GetUser( x, uid ) ).FirstOrDefault( );
    }
}

更新:這是內聯工作的代碼

public User GetUser(long uid, long uid_user)
        {
            using (var entities = new myEntities())
            {

                var q = from u in entities.DbUsers
                        where u.uid == uid_user
                        select new User
                        {
                            Uid = u.uid,
                            FirstName = u.first_name,
                            LastName = u.last_name,
                            BigPicUrl = u.pic_big,
                            Birthday = u.birthday,
                            SmallPicUrl = u.pic_small,
                            SquarePicUrl = u.pic_square,
                            Locale = u.locale.Trim(),
                            IsFavorite = u.FavoriteFriends1.Any(x => x.uid == uid),
                            FavoriteFriendCount = u.FavoriteFriends.Count,
                            LastWishlistUpdate = u.WishListItems.OrderByDescending(x => x.added).FirstOrDefault().added,
                            Sex = (UserSex)u.sex
                        };

                var user = q.FirstOrDefault();
                user.DaysUntilBirthday = user.Birthday.DaysUntilBirthday();
                return user;
            }
        }

熱門答案

錯誤是現場,您無法將其轉換為T-SQL(或P-SQL)查詢。

在嘗試將查詢水合成其他類型之前,您需要確保已執行查詢。

保持簡單,使用擴展方法。這就是他們的目的。

public static User ToUserEntity(this DbUser user)
{
    return new User
    {
        Uid = user.uid,
        FirstName = user.first_name,
        LastName = user.last_name
    };
}

然後在你的DAL中:

public User GetUser(long uid)
{
    User dbUser;

    using (var entities = new myEntities())
    {
        dbUser = entities.DbUsers
                  .Where( x => x.uid == uid && x.account_status == (short)AccountStatus.Active )
                 .FirstOrDefault(); // query executed against DB
    }

    return dbUser.ToUserEntity();
}

在上下文處理 ,看看我如何將POCO水合成一個物體?這樣,在嘗試水合成自定義對象之前,確保EF已完成表達式工作。

此外,我不知道為什麼你將uid傳遞給那個方法,它甚至沒有被使用。

再進一步說明,你不應該做這種事情(將EF POCO投射到你自己的對像中)。

如果你這樣做,這是自定義POCO的一個很好的例子(將表格直接映射到你的自定義POCO,不要使用代碼生成)。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因