How do you do a SQL style 'IN' statement in LINQ to Entities (Entity Framework) if Contains isn't supported?

后端 未结 4 1821
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-13 16:57

I\'m using LINQ to Entities (not LINQ to SQL) and I\'m having trouble creating an \'IN\' style query. Here is my query at the moment:

var items = db.InventoryIt         


        
相关标签:
4条回答
  • 2021-02-13 17:25

    You need to either use this one:

    .Where(string.Format("it.ID in {0}", string.Join(",", valueIds.ToArray())));
    

    or construct the WHERE part dynamically, as in this post.

    P.S. - Information has been updated and this answer updated as follows to maintain relevance:

    The link referenced contains the following update:

    ...in EF4 we added support for the Contains method and at least in this specific case for collection-valued parameters. Therefore this kind of code now works right out of the box and it is not necesary to use any additinal expression building method:

    var statusesToFind = new List<int> {1, 2, 3, 4};
    var foos = from foo in myEntities.Foos
               where statusesToFind.Contains(foo.Status)
               select foo;
    
    0 讨论(0)
  • 2021-02-13 17:25

    As mentioned by Diego B Vega in this post (second answer), Contains should now work in EF4.

    0 讨论(0)
  • 2021-02-13 17:38

    You can use Linq's Any extension method for this in some cases:

    var userIds = new[] { 1, 2, 3 };
    
    from u in Users
         where userIds.Any(i => i==u.Id)
         select u;
    

    The generated SQL looks pretty strange in such a case, but like much Linq-to-Entities generated SQL it might be overly verbose for a human, but runs fast in practice.

    SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[DisplayName] AS [DisplayName], 
    FROM [dbo].[Users] AS [Extent1]
    WHERE  EXISTS (SELECT 
        1 AS [C1]
        FROM  (SELECT 
            [UnionAll1].[C1] AS [C1]
            FROM  (SELECT 
                1 AS [C1]
                FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]
            UNION ALL
                SELECT 
                2 AS [C1]
                FROM  ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
        UNION ALL
            SELECT 
            3 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable3]) AS [UnionAll2]
        WHERE [UnionAll2].[C1] = [Extent1].[Id]
    )
    
    0 讨论(0)
  • 2021-02-13 17:43

    My workaround is to convert the entities result to a List and after that apply the Contains().

    Example:

    var items = db.InventoryItem
                    .Include("Kind")
                    .Include("PropertyValues")
                    .Include("PropertyValues.KindProperty")
                    .ToList()
                    .Where(itm => valueIds.Contains(itm.ID));
    
    0 讨论(0)
提交回复
热议问题