联合2列出了在两个源列表中发生的ID的附加内容更改

时间:2013-04-02 16:51:39

标签: linq

如何合并这两个系列?

问题:当ApplicationID在listOfPM和listOfPM2中时,Test2为null并且应该是数字

var listOfPM = from d in gbc
                select new Tab24PresentationModel
                {
                    ApplicationID = d.ApplicationID,
                    ApplicationName = d.ApplicationName,
                    Test1 = d.count,
                    Test2 = null
                };


var listOfPM2 = from d in gbc2
                select new Tab24PresentationModel
                {
                    ApplicationID = d.ApplicationID,
                    ApplicationName = d.ApplicationName,
                    Test1 = null,
                    Test2 = d.count
                };


var result = listOfPM.Union(listOfPM2);  

尝试从listOfPM2中的PM和Test1列表中删除Test2并获取:

  

类型'xxx.Tab24PresentationModel'出现在单个LINQ to Entities查询中的两个结构不兼容的初始化中。可以在同一查询中的两个位置初始化类型,但前提是在两个位置都设置了相同的属性,并且这些属性的设置顺序相同。

我可以想办法使用多个foreach ...想使用Linq!

2 个答案:

答案 0 :(得分:0)

您需要手动合并这两个对象(使用相同的ApplicationID),无法解决这个问题。

编辑 - 试试这个:

var list = gbc.Union( gbc2 ).ToLookup( d => d.ApplicationID ).Select( g =>
    {
        var first = g.First();
        var retVal = new Tab24PresentationModel
        {
            ApplicationID = first.ApplicationID,
            ApplicationName = first.ApplicationName,
            Test1 = first.count,
            Test2 = null
        };

        var second = g.Skip(1).Take(1).SingleOrDefault();

        if( null != second )
        {
            retVal.Test2 = second.count;
        }

        return retVal;
    } );

编辑2:hrm,只有当只有gbc2存在时你不想要Test1 = null, Test2 = value时才会有效。如果这不是问题,你应该没问题。

答案 1 :(得分:0)

非常感谢您的回答和评论 - 这就是我想出来的。

// take each list in turn and either add or update
var result = new List<Tab24PresentationModel>();
foreach (var t in listOfPM)
{
    var a = new Tab24PresentationModel
        {
            ApplicationID = t.ApplicationID,
            ApplicationName = t.ApplicationName,
            Test1 = t.Test1
        };

    result.Add(a);
}

// list2
foreach (var t in listOfPM2)
{
    // is this already in result
    if (result.Any(x => x.ApplicationID == t.ApplicationID))
    {
        var existing = result.First(x => x.ApplicationID == t.ApplicationID);
        existing.Test2 = t.Test2;
    }
    else
    {
        var a = new Tab24PresentationModel
            {
                ApplicationID = t.ApplicationID,
                ApplicationName = t.ApplicationName,
                Test2 = t.Test2
            };
        result.Add(a);
    }
}