我有两个实体:FileVersionInfo.GetVersionInfo(ConfigurationManager.AppSettings["DllPathForBackUp"]).FileVersion;
和Order
以及它们之间的多对多关系。我有一个接收ItemId作为参数的方法,如下所示:
Item
ItemSet表中有很多行,因此第一个查询很重。有没有一种方法可以将项目添加到订单中,而无需先在" ItemSet"上进行查询。表?我的意思是,我可以将ItemId直接添加到Order.Items或类似的东西吗?
答案 0 :(得分:1)
Item item = new Item { ID = ItemId };
Order order = new Order { ID = OrderId };
db.ItemSet.Attach(item);
db.OrderSet.Attach(order);
order.Items.Add(item);
db.SaveChanges();
请确保在Order类中有这个:
public Order()
{
Items = new List<Item>();
}
所以你不会在order.Items.Add(item);
答案 1 :(得分:0)
所以你可以为实体建模,所以:
public DbSet<Item> ItemSet {get;set;}
public DbSet<Order> OrderSet {get;set;}
public DbSet<ItemOrder> ItemOrders {get;set;}
public class Item
{
public int Id {get;set;}
}
public class Order
{
public int Id {get;set;}
}
public class ItemOrder
{
[Key, Column(Order = 0)]
public int ItemId {get;set;}
[Key, Column(Order = 1)]
public int OrderId {get;set;}
}
所以为了更新:
public void AddItems(int OrderId, int ItemId)
{
var itemExists = db.ItemOrders.FirstOrDefault(x => x.OrderId == OrderId && x.ItemId == ItemId);
if (itemExists != null) return;
db.ItemOrders.Add(new ItemOrder { OrderId = OrderId, ItemId = ItemId });
db.SaveChanges();
}
然后您可以使用LINQ .Join()
进行查询,并且非常简单。
为了完整起见,OP提到导航属性现已消失。因此,如果您知道OrderId
,那么您可以这么做:
var items = db.ItemOrders.GroupJoin(
db.ItemSet,
io => io.ItemId,
i => i.Id,
(itemOrder, items) => items)
.ToList();
因此,为了引导您完成,GroupJoin
会询问您要加入的IQueryable
/ IEnumerable
数据。
第二个参数是初始数据集的字段,即您要加入的集合ItemOrders
。
第三个参数是正在加入的集合的字段,即ItemSet
。
fouth参数基本上是Select
,其中会显示大约Func
的{{1}}签名。
您可以将同样的逻辑应用于LINQ (ItemOrder itemInFirstSet, IEnumerable<Item> itemsThatAreJoined)
扩展名。但不是Join
而是itemsThatAreJoined
。因此区别为itemThatIsJoined
会找到多个匹配的实体,GroupJoin
只会找到一个。
这不是详细解释,更多是概述