0

我想知道即使对于小型数据库,这个 linq 查询也需要几个小时。有一个带有子查询的旧版本,但它会抛出异常。

var a = (
    from item1 in fullMappingData
    from item2 in dc.EntityMasters
    from item3 in dc.Entities
    from item4 in dc.Contributors

    where (
        item1.Name
             .Replace(" ", "")
             .Replace(",", "")
             .Trim()
            == item2.CBEntityName
                    .Replace(" ", "")
                    .Replace(",", "")
                    .Trim()
            &&
        item1.ContributedName
             .Replace(" ", "")
             .Replace(",", "")
             .Trim()
            == item3.EntityName
                    .Replace(" ", "")
                    .Replace(",", "")
                    .Trim()
            &&
        item1.ContributorName
             .Replace(" ", "")
             .Replace(",", "")
             .Trim()
            == item4.ContributorName
                    .Replace(" ", "")
                    .Replace(",", "")
                    .Trim()
    )
    select new Mapping
    {
        ContributedID =item3.ContributedID, // (from x in dc.Entities
                                            //where x.EntityName.Replace(" ", "").Replace(".", "").Replace(",", "").Trim() == item1.ContributedName.Replace(" ", "").Replace(",", "").Trim()
                                            //select x.ContributedID).First(),

        ContributorID = item4.ContributorID,//(from x in dc.Contributors
                                            //where x.ContributorName.Replace(" ", "").Replace(".", "").Replace(",", "").Trim() == contributor.Replace(" ", "").Replace(",", "").Trim()
                                            //select x.ContributorID).First(),

        NameID = item2.NameID   //(from x in dc.EntityMasters
                                // where x.EntityName.Replace(" ", "").Replace(".", "").Replace(",", "").Trim() == item1.Name.Replace(" ", "").Replace(",", "").Trim()
                                //select x.NameID).First()
    }
);

谢谢!

4

3 回答 3

3

尝试使用join代替where.

于 2013-10-16T13:08:49.670 回答
0

首先,您应该处理代码异味并继续为您的字符串预处理创建一个新方法:

private static string Simplify(string value)
{
  return value.Replace(" ", "").Replace(",", "").Trim();
}

正如@Darren 指出的那样,.Trim()如果您已经删除了所有空格,则可能什么都不做,但我假设您将其留在那里是因为您担心前导/尾随制表符和换行符?

join现在,您可以通过采用@Virus 的建议并使用以下方法来大大简化逻辑(并加快整个过程)from

var a =
  from item1 in fullMappingData
  join item2 in dc.EntityMasters on Simplify(item1.Name) equals Simplify(item2.CBEntityName)
  join item3 in dc.Entities on Simplify(item1.ContributedName) equals Simplify(item3.EntityName)
  join item4 in dc.Contributors on Simplify(item1.ContributorName) equals Simplify(item4.ContributorName)
  select new Mapping
  {
    ContributedID = item3.ContributedID,
    ContributorID = item4.ContributorID,
    NameID = item2.NameID
  };
于 2013-10-16T17:03:23.777 回答
0

Linq 很棒,但如果你想要性能,你将不得不做更多的事情。我认为您应该将查询分成更小的部分并使用 Hasshets/Discitonaries。

使用 where 甚至使用连接,您将不得不面对这样一个事实,即当使用线性搜索执行匹配时,性能将下降。

尤其是当您改变许多条件时,Replace我不希望有任何好的表现。

从我的角度来看,您应该将Replace参与连接条件的键(在您过滤它们之后)插入到字典中,然后使用 TryGet、ContainsKey 或任何其他基于哈希的查找而不是线性查找来查找它们。

当然,您必须意识到,使用此程序的内存要求会变得更糟。

于 2013-10-16T13:10:18.883 回答