我有这三个表:
$listMapper->add(
'classes',null, array(
'editable' => true,
'type' => 'sonata_type_model_autocomplete',
'multiple' => true,
'property' => 'name'
)
);
我想创建一个LINQ查询,在那里我将能够获得 id,name,typeId,as_of中的最新日期及其当时的数量
我试过这样做,但这就是我所拥有的。我是asp.net和LINQ的新手,所以我真的不知道我在做什么。
Item
id, name, isDeleted, typeId
ItemType
id, name, isDeleted
Item_Quantity
itemId, as_of(datetime), quantity
//the sample data
1, 2017-09-19, 55
2, 2017-08-21, 37
1, 2017-09-20, 49
答案 0 :(得分:0)
假设您的Item
实体具有ItemQuantities
public class Item
{
public int Id { set;get; }
public string Name { set;get; }
public int ItemTypeId { set;get;}
public virtual ItemType ItemType { set;get; }
public ICollection<ItemQuantity> ItemQuantities { set; get; }
}
public class ItemType
{
public int Id { set;get; }
public string Name { set;get; }
}
public class ItemQuantity
{
public int Id { set;get; }
public DateTime AsOf { set;get ;}
public int Qunatity { set;get;}
public int ItemId { set;get; }
public virtual Item Item { set;get; }
}
您可以查询db.Items集合,并按ItemQuantities
值对每个项目的AsOf
属性进行排序,并获取第一项。
因此,创建一个视图模型来表示此数据
public class ItemVm
{
public int Id { set; get; }
public string Name { set;get; }
public string ItemTypeName { set;get; }
public DateTime? RecentOrderDate { set;get; }
public double? Qty { set;get;}
}
现在在Linq查询中,投影到这个新的视图模型。
var items = db.Items.Select(g => new ItemVm
{
Id = g.Id,
Name = g.Name,Id
ItemTypeName= g.ItemType.Name,
RecentOrderDate = g.ItemQuantities.Any()?
g.ItemQuantities.OrderByDescending(q=>q.AsOf).FirstOrDefault().AsOf
:(DateTime?)null,
Qty = g.ItemQuantities.Any() ?
g.ItemQuantities.OrderByDescending(q => q.AsOf).FirstOrDefault().Quantity
:(int?) null,
}).ToList();
上面的代码将创建我们的新视图模型类对象的列表。因此,如果您在操作方法中使用此代码并传递给视图,则需要确保更新视图,以便现在可以将其强类型化为ItemVm
return View(items);
,您的观点将是
@model List<ItemVm>