我有一个mapper函数:
public void Mapper(List<Item> items, List<List> lists, List<ListItem> listItems)
{
using (var command = Context.CreateCommand())
{
command.CommandText = @"SELECT ListItem.ListId, ListItem.ItemId, Item.ItemId AS ItemItemId, List.ListId AS ListListId
FROM Item INNER JOIN
ListItem ON Item.ItemId = ListItem.ItemId INNER JOIN
List ON ListItem.ListId = List.ListId";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int listid = (int)reader["ListId"];
int itemid = (int)reader["ItemId"];
int listlistid = (int)reader["ListId"];
int itemitemid = (int)reader["ItemItemId"];
foreach (var listitem in listItems)
{
foreach (var item in items)
{
if (item.ItemId == itemitemid && itemitemid == itemid)
{
listitem.Item = item;
}
}
foreach (var list in lists)
{
if (list.ListId == listlistid && listlistid == listid)
{
listitem.List = list;
}
}
}
}
}
}
}
我的目标是实体列表的3个参数,我从我的数据库中获取,但我需要映射&#34; List和Listitem&#34;之间的引用。和&#34; Item和ListItem&#34;。
我的问题是它似乎总是将引用映射到其表中的LAST Item和List,例如,如果我是其表中的最后一个列表是&#34; Fridge&#34;并且其表中的最后一项是&#34; Milk&#34;,所有列表项都将引用这些项目。
有人可以帮忙吗?请告诉我是否需要在评论中提供更多代码。 :)
编辑:ListItem实现
public class ListItem
{
public virtual int Amount
{
get;
set;
}
public virtual int Volume
{
get;
set;
}
public virtual string Unit
{
get;
set;
}
public virtual List List
{
get;
set;
}
public virtual Item Item
{
get;
set;
}
}
答案 0 :(得分:1)
listItems
的所有元素最终将Item
分配给items
中的最后一个元素,并将List
分配给{{1}中的最后一个元素的原因}}因为lists
中的每个元素(参见listItems
)最终都被分配,无条件,对于数据库中的每个foreach
(参见最外层{ {1}})。
为了更简单地解释,你拥有的代码就是这个伪代码的逻辑等价物。
ListItem
假设while
中的3个元素和foreach (db_element in db)
{
foreach (list_element in list)
{
list_element.property = ...;
}
}
中的5个元素将有15个赋值(3 x 5 = 15),而不是您想要的3个。
相反,这是您可以实现匹配db
list
答案 1 :(得分:0)
在这里,我已经为您更改了代码,因此您可以通过添加条件来确切了解我的意思。
请注意我们正在执行continue
的行。
public void Mapper(List<Item> items, List<List> lists, List<ListItem> listItems)
{
using (var command = Context.CreateCommand())
{
command.CommandText = @"SELECT ListItem.ListId, ListItem.ItemId, Item.ItemId AS ItemItemId, List.ListId AS ListListId
FROM Item INNER JOIN
ListItem ON Item.ItemId = ListItem.ItemId INNER JOIN
List ON ListItem.ListId = List.ListId";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int listid = (int)reader["ListId"];
int itemid = (int)reader["ItemId"];
int listlistid = (int)reader["ListId"];
int itemitemid = (int)reader["ItemItemId"];
foreach (var listitem in listItems)
{
// This is the condition you're missing.
if (listitem.ListId != listid &&
listitem.ItemId != itemid)
{
continue;
}
foreach (var item in items)
{
if (item.ItemId == itemitemid && itemitemid == itemid)
{
listitem.Item = item;
}
}
foreach (var list in lists)
{
if (list.ListId == listlistid && listlistid == listid)
{
listitem.List = list;
}
}
}
}
}
}
}