当我尝试更新我的viewmodel时,在此上下文中仅支持原始类型(例如Int32,String和Guid')

时间:2011-03-06 02:17:17

标签: linq asp.net-mvc-3

我正在努力编写一个linq查询。

我试图使用存储库模式而没有太多运气。基本上我有一个事务列表和第二个列表,其中包含在我的案例中映射的描述字段StoreItemID

    public static IList<TransactionViewModel> All()
    {
        var result = (IList<TransactionViewModel>)HttpContext.Current.Session["Transactions"];
        if (result == null)
        {
            var rewardTypes = BusinessItemRepository.GetItemTypes(StoreID);
            HttpContext.Current.Session["Transactions"] = 
                result =
              (from item in new MyEntities().TransactionEntries
                 select new TransactionViewModel()
                                   {
                            ItemDescription = itemTypes.FirstOrDefault(r=>r.StoreItemID==item.StoreItemID).ItemDescription,
                     TransactionDate = item.PurchaseDate.Value,
                     TransactionAmount = item.TransactionAmount.Value,
                                   }).ToList();
        }
        return result;
    }


     public static List<BusinessItemViewModel>GetItemTypes(int storeID)
    {
        var result = (List<BusinessItemViewModel>)HttpContext.Current.Session["ItemTypes"];
        if (result == null)
        {
            HttpContext.Current.Session["ItemTypes"] = result =
                (from items in new MyEntities().StoreItems
                 where items.IsDeleted == false && items.StoreID == storeID
                 select new BusinessItemViewModel()
                 {
                     ItemDescription = items.Description,
                     StoreID = items.StoreID,
                     StoreItemID = items.StoreItemID
                 }).ToList();
        }
        return result;

但是我收到此错误

  

无法创建“MyMVC.ViewModels.BusinessItemViewModel”类型的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')。

我知道它的这行代码就好像我发表评论它确实可行

ItemDescription = itemTypes.FirstOrDefault(r=>r.StoreItemID==item.StoreItemID).ItemDescription,

如何将ItemDescription映射到itemTypes列表?

任何帮助都会很棒:)

3 个答案:

答案 0 :(得分:1)

这一行存在问题:

 ItemDescription = itemTypes.FirstOrDefault(r=>r.StoreItemID==item.StoreItemID)
                            .ItemDescription,

由于您使用FirstOrDefault,如果没有满足条件的项目,您将获得null作为引用类型的默认值,那么在尝试访问{{}时会遇到异常1}} - 如果始终存在至少一个匹配项,则使用ItemDescription或检查并定义First()的默认属性值(如果没有则使用):

ItemDescription

答案 1 :(得分:1)

如果itemTypes是IEnumerable,则它不能在您的查询中使用(这是错误消息告诉您的内容),因为查询提供程序不知道如何处理它。因此,假设itemTypes基于与TransactionEntities相同的数据库中的表,那么您可以使用连接来实现相同的目标:

using (var entities = new MyEntities())
{
    HttpContext.Current.Session["Transactions"] = result =
                (from item in new entities.TransactionEntries
                 join itemType in entities.ItemTypes on item.StoreItemID equals itemType.StoreItemID
                 select new TransactionViewModel()
                 {
                     ItemDescription = itemType.ItemDescription,
                     TransactionDate = item.PurchaseDate.Value,
                     TransactionAmount = item.TransactionAmount.Value,
                     CustomerName = rewards.CardID//TODO: Get customer name

                 }).ToList();
}

我不知道你的数据库的结构,但希望你能得到这个想法。

答案 2 :(得分:1)

由于我的LINQ查询中存在可以为空的整数,因此出现此错误。 在我的查询中添加一个检查它解决了我的问题。

查询问题:

var x = entities.MyObjects.FirstOrDefault(s => s.Obj_Id.Equals(y.OBJ_ID));

解决问题的查询:

var x = entities.MyObjects.FirstOrDefault(s => s.Obj_Id.HasValue && s.Obj_Id.Value.Equals(y.OBJ_ID));