我有一个CheckedListbox,其中包含一些名为products的表中的值。 我们的想法是检查与客户相关的产品。现在它确实在链接表中正确保存,但再次加载时,检查的项目无法正确加载到CheckedListbox中。
所以从那个链接表中,我想从一列中获取所有行。所有表都已加载到应用程序中,因此我不想使用sql。
我尝试过使用linq,没有成功,Ids在这里是空的。
int[] Ids = (from m in dataset.Tables["LinkTable"].AsEnumerable()
where m.Field<int>("customerId") == customerId
select m.Field<int>("productId")).ToArray();
然后,如果我成功获得这些ID,我想获得这些主键的索引,以便我可以将正确的产品设置为checked
。
我已经厌倦了这样做,但是这给了我程序其他部分的错误,因为我正在设置一个全局数据表的主键。 Datagridviews不喜欢这样。
DataColumn[] keyColumns = new DataColumn[1];
keyColumns[0] = dataset.Tables["products"].Columns["Id"];
currentPatient.GetTheDataSet.Tables["products"].PrimaryKey = keyColumns;
foreach (int Id in Ids)
{
DataRow row = dataset.Tables["Products"].Rows.Find(Id);
int index = dataset.Tables["Products"].Rows.IndexOf(row);
clbMedications.SetItemChecked(index, true);
}
我想在没有指定主键的情况下完成最后一部分,我无法在linq中找到如何做到这一点。
我知道它包含两个问题,但也许只需要一个linq语句即可完成,所以我最好将它们组合起来。
答案 0 :(得分:1)
<强> [编辑] 强>
最后,我想我已经得到了你需要的东西:
var qry = (from p in ds.Tables["products"].AsEnumerable()
select new {
Id = p.Field<int>("Id"),
Index = ds.Tables["products"].Rows.IndexOf(p),
Checked = ds.Tables["LinkTable"].AsEnumerable().Any(x=>x.Field<int>("productId") == p.Field<int>("Id") && x.Field<int>("customerId")==customerid)
}).ToList();
以上查询会返回列表,您可以使用 CheckedListbox 进行查找。