添加到多个Linq查询的字典查询结果

时间:2014-10-13 10:50:06

标签: c# linq dictionary

我想将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查询结果添加到字典中?

3 个答案:

答案 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()));