代码之家  ›  专栏  ›  技术社区  ›  Ronnie Overby

LINQ到SQL问题

  •  4
  • Ronnie Overby  · 技术社区  · 14 年前

    我有一个记录id(整数)的本地集合。

    我需要检索本地集合中每个子记录的id的记录。

    我的问题是:

    public List<int> OwnerIds { get; private set; }
    ...
    filteredPatches = from p in filteredPatches
                      where OwnerIds.All(o => p.PatchesOwners.Select(x => x.OwnerId).Contains(o))
                      select p;
    

    我得到这个错误:

    除contains()运算符外,在查询运算符的linq to sql实现中不能使用本地序列。

    我知道linq to sql不支持.all(),但是有没有办法做我想做的事情?

    5 回复  |  直到 14 年前
        1
  •  1
  •   Amy B    14 年前

    客户在哪里 子集合中的orderid是内存集合中id的子集。

    from c in myDC.Customer
    where c.Orders.All(o => myList.Contains(o.ID))
    select c;
    

    客户在哪里 内存中集合中的orderid是子集合中id的子集。

    from c in myDC.Customers
    where (from o in c.Orders
        where myList.Contains(o.ID)
        group o.ID by o.ID).Distinct().Count() == myList.Count()
    select c;
    

    客户在哪里 内存中集合中的orderid设置为等于子集合中的id。

    from c in myDC.Customers
    let Ids = c.Orders.Select(o => o.ID).Distinct()
    where Ids.Count() == myList.Count()
      && Ids.All(id => myList.Contains(id))
    select c;
    

    所有这些都为我生成了sql。

    这些假设ID在MyList中已经是不同的了。如果还没有,请使用:

    myList = myList.Distinct().ToList();
    

    PSS-适合列出多达2000个项目。高于此值将被转换为SQL,然后SQL Server将在参数数量上显示BARF。

        2
  •  1
  •   JMarsch    14 年前

    我不知道用linq to sql怎么做。问题是,您需要将您的列表传递到服务器,以便它可以对其进行查询。(您的列表在计算机的内存中,SQL Server需要在服务器上进行筛选)

    对于直接SQL,可以使用带有“in()”运算符的常规select语句来执行此操作。(在“in”中不要超过1000项)

    可以将所有id插入sql中的临时表中,然后连接到该表(可以将linq用于此解决方案,但它需要两个步骤-插入(假设有一个“set s”表),然后连接查询(然后是一个清除查询以删除集)。

    您可以在不使用筛选条件的情况下进行linq查询,然后在内存集中进行筛选(如果未筛选的结果集可能很大,则不建议使用)。

        3
  •  1
  •   Mike Gleason jr Couturier    14 年前

    编译器说的是…

    OwnerIds.Contains(someVariable)
    

    支持,并将其翻译为:

    WHERE someVariable IN (OwnerId1, OwnerId2, OwnerIdN)
    

    现在,我们还没有你要查询的所有信息,但是如果你能重新定义你要使用的东西 Contains ,你会没事的。

        4
  •  0
  •   DarrenMcD    14 年前

    你能加入Ownerids吗?

        5
  •  0
  •   EgorBo    14 年前

    错误说 局部序列 (意味着ownerids)不能在查询运算符的linq-to-sql实现中使用,但contains()运算符除外。” 所以你可以:

    1)从SQL加载所有FilteredPatches行

    var loadedData = filteredPatches.Select(i => i).ToList();
    

    2)将数据过滤为简单的本地序列

    var result = loadedData.Where(i => i.PatchesOwners.All(o => OwnerIds.Contains(o.ID)));