Linq查询非常慢(从未完成)

时间:2013-10-16 13:03:42

标签: sql linq

我想知道这个linq查询甚至需要几个小时的数据库 有一个带有子查询的旧版本,但它会抛出一个exeption。

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()
    }
);

谢谢!

3 个答案:

答案 0 :(得分:3)

尝试使用join代替where

答案 1 :(得分:0)

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

使用连接或甚至使用连接时,您将不得不面对这样的事实:当使用线性搜索执行匹配时,性能将降低。

特别是当您使用许多Replace来改变条件时,我不会期望有任何良好的表现。

从我的角度来看,你应该在键盘中插入键 - 在你用Replace过滤它们之后 - 参与连接条件,之后使用TryGet,ContainsKey或任何其他基于哈希的查找来查找它们不是线性的。

当然,你必须意识到,通过这个程序,内存需求会变得更糟。

答案 2 :(得分:0)

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

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

正如@Darren所指出的那样,如果你已经删除了所有空格,.Trim()可能无效,但我认为你已将它留在那里,因为你担心领先/尾随制表符和换行符?

现在,您可以通过@ Virus的建议并使用join代替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
  };