抱歉,如果以前有人问过这个问题,但我在任何地方都找不到我要找的东西。
设置:我有一个带有 3 个表的 MS SQL 数据库
表- FoodInfo
列- FoodId(PK)、DanName
表- CompName
列- CmpId(PK)、CmpName
表- 营养素(连接表)
列- FoodId(FK)、CmpId(fk)、BestLoc
对于每个 DanName 行,关联大约 8 个 CmpName,对于每个 CmpName,关联 1 个 BestLoc
当我在我的 winform 中显示数据时,这导致 DanName 重复 8 次。
问题是,我想在一行中显示 DanName 以及相关的 CmpName 及其值。
类似于:DanName - CmpName1 - BestLoc 值 - CmpName2 - BestLoc 值 - CmpName3 - BestLoc 值..等等。
我对解决方案非常灵活,但我不确定要遵循什么路径。我应该尝试在数据库中创建一个看起来像我想要的表并将其放入 DataGridView 中,还是应该尝试使用 Linq-To-SQL 解决它并将其放入列表视图中?
如前所述,我对解决方案非常灵活,我只是不希望文本框中的数据。我还希望可以使用我检索到的数据并在我的程序的其他地方使用它。
如果有人有解决方案,我很乐意看到一个例子。
编辑: 更详细一点,并带有一些代码示例。
我的 DAL 类与 linq
void bw_DoWork(object sender, DoWorkEventArgs e)
{
Table<FoodInfo> FoodInfo = db.GetTable<FoodInfo>();
Table<CompName> CompName = db.GetTable<CompName>();
Table<Nutrient> Nutrients = db.GetTable<Nutrient>();
var foods =
from compname in CompName
join nutrients in Nutrients on compname.CompId equals nutrients.CompId
join foodinfo in FoodInfo on nutrients.FoodId equals foodinfo.FoodId
where foodinfo.DanName.StartsWith(searchWord) && (compname.CompId >= 0
&& compname.CompId < 8)
select new { foodinfo.DanName, compname.CmpNamDK, nutrients.BestLoc };
foreach (var food in foods)
{
DanName = food.DanName;
Compname = food.CmpNamDK;
BestLoc = food.BestLoc;
OnSearchResultArgs OSR = new OnSearchResultArgs(DanName, Compname, BestLoc);
onResult(this, OSR);
}
}
它在我的表单中触发一个事件处理程序并发送结果并执行此代码:
listView1.FullRowSelect = true;
listView1.Columns.Add("DanName", 100);
listView1.Columns.Add("CompName", 150);
listView1.Columns.Add("BestLoc", 50);
private void UpdateControls(object sender, OnSearchResultArgs e)
{
var item = new ListViewItem();
item.Text = e.DanName;
item.SubItems.Add(e.CompName);
item.SubItems.Add(e.BestLoc);
listView1.Items.Add(item);
}
UpdateControl 正在被调用,但我认为没有必要将其放在这里。
通过这个我得到以下信息:
我想把这 8 行变成 1 行。喜欢: