我正在努力编写一个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列表?
任何帮助都会很棒:)
答案 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));