我想将3个linq的结果添加到单个词典中。
Dictionary<string, string> dict = new Dictionary<string, string>();
dict = ctx.tbl1.Where(a => a.Id == cid).ToDictionary(a => a.FieldName, a => a.LabelName);
dict = ctx.tbl2.Where(a => a.Id == cid).ToDictionary(a => a.FieldName, a => a.LabelName);
dict = ctx.tbl3.Where(a => a.Id == cid).ToDictionary(a => a.FieldName, a => a.LabelName);
return dict;
上面的代码给出了最后dict
个结果。如何使用每个linq
查询结果添加到字典中?
答案 0 :(得分:2)
试试这个:
Dictionary<string, string> dict = new Dictionary<string, string>();
foreach (var a in ctx.tbl1.Where(a => a.Id == cid)) dict.Add(a.FieldName, a.LabelName);
foreach (var a in ctx.tbl2.Where(a => a.Id == cid)) dict.Add(a.FieldName, a.LabelName);
foreach (var a in ctx.tbl3.Where(a => a.Id == cid)) dict.Add(a.FieldName, a.LabelName);
return dict;
要考虑的一些事情:
如果相同(区分大小写)a.FieldName
出现在多个表中,或者在给定a.Id
的同一个表中多次出现,则会抛出此内容。
底层数据库是否有约束来防止这种情况发生?如果可能应该,除非数据的性质使得a.FieldName
可以合法地出现给定a.Id
多次。在后一种情况下,将它们映射到ILookup
可能更合适。
如果a.FieldName
不区分大小写,请使用不区分大小写的字符串比较器创建字典。
如果a.Id,a.FieldName
的唯一性适用于3个表的聚合,那么用单个表替换它们会更有意义吗?
答案 1 :(得分:0)
您可以先创建IEnumerable,然后将其转换为Dictionary。
如果您的模型如下,
public class DummyModel
{
private const decimal MinValue = 0m;
public int Id { get; set; }
public string FieldName { get; set; }
public string LabelName { get; set; }
//[DecimalValidatorAttrubute(precision: 2, maxdigits: 2, minValue: decimal.MinValue, maxValue: 99.99m)]
//public decimal Decimal { get; set; }
}
以下方法
private Dictionary<string, string> getDictionary()
{
var tbl1 = new List<DummyModel>() { new DummyModel() { Id = 1, FieldName = "Field1", LabelName = "Label1" }, new DummyModel() { FieldName = "Field2", LabelName = "Label2" } };
var tbl2 = new List<DummyModel>() { new DummyModel() { Id = 1, FieldName = "Field3", LabelName = "Label3" }, new DummyModel() { FieldName = "Field4", LabelName = "Label4" } };
var tbl3 = new List<DummyModel>() { new DummyModel() {Id = 1,FieldName = "Field5", LabelName = "Label5" }, new DummyModel() { FieldName = "Field6", LabelName = "Label6" } };
const int cid = 1;
Dictionary<string, string> dict = new Dictionary<string, string>();
dict = tbl1.Where(a => a.Id == cid)
.Concat(tbl2.Where(a => a.Id == cid))
.Concat(tbl3.Where(a => a.Id == cid))
.ToDictionary(a => a.FieldName, a => a.LabelName);
return dict;
}
可以帮助您实现像
这样的东西[TestMethod]
public void LinqDictionary()
{
var dict = getDictionary();
foreach (var item in dict)
{
Console.WriteLine("FieldName {0}, LabelName {1} ", item.Key, item.Value);
}
}
输出
FieldName Field1, LabelName Label1
FieldName Field3, LabelName Label3
FieldName Field5, LabelName Label5
答案 2 :(得分:0)
要从多个查询向字典添加项目,我使用更多linq,直接将第一个集合添加到字典中,然后使用tolist和foreach添加后续项目。我怀疑性能是超级的,但在这种情况下(添加控件)不太重要TBH我怀疑ToDictionary无论如何都要表现得更快。
Dictionary<string, SomeObject> controlsChanged;
controlsChanged = this.Controls.OfType<TextBox>().Select(c => c.Name).ToDictionary(k => k, v => new SomeObject());
this.Controls.OfType<ComboBox>().ToList().ForEach(c => controlsChanged.Add(c.Name, new SomeObject()));