Linq to SQL how to do “where [column] in (list of values)”

前端 未结 5 1690
情话喂你
情话喂你 2020-11-29 20:43

I have a function where I get a list of ids, and I need to return the a list matching a description that is associated with the id. E.g.:

public class CodeDa         


        
相关标签:
5条回答
  • 2020-11-29 21:23

    You could also use:

    List<int> codes = new List<int>();
    
    codes.add(1);
    codes.add(2);
    
    var foo = from codeData in channel.AsQueryable<CodeData>()
              where codes.Any(code => codeData.CodeID.Equals(code))
              select codeData;
    
    0 讨论(0)
  • 2020-11-29 21:24
     var filterTransNos = (from so in db.SalesOrderDetails
                        where  ItemDescription.Contains(ItemDescription)
                                select new { so.TransNo }).AsEnumerable();    
    
    
    listreceipt = listreceipt.Where(p => filterTransNos.Any(p2 => p2.TransNo == p.TransNo)).ToList();
    
    0 讨论(0)
  • 2020-11-29 21:30

    I had been using the method in Jon Skeet's answer, but another one occurred to me using Concat. The Concat method performed slightly better in a limited test, but it's a hassle and I'll probably just stick with Contains, or maybe I'll write a helper method to do this for me. Either way, here's another option if anyone is interested:

    The Method

    // Given an array of id's
    var ids = new Guid[] { ... };
    
    // and a DataContext
    var dc = new MyDataContext();
    
    // start the queryable
    var query = (
        from thing in dc.Things
        where thing.Id == ids[ 0 ]
        select thing 
    );
    
    // then, for each other id
    for( var i = 1; i < ids.Count(); i++ ) {
        // select that thing and concat to queryable
        query.Concat(
            from thing in dc.Things
            where thing.Id == ids[ i ]
            select thing
        );
    }
    

    Performance Test

    This was not remotely scientific. I imagine your database structure and the number of IDs involved in the list would have a significant impact.

    I set up a test where I did 100 trials each of Concat and Contains where each trial involved selecting 25 rows specified by a randomized list of primary keys. I've run this about a dozen times, and most times the Concat method comes out 5 - 10% faster, although one time the Contains method won by just a smidgen.

    0 讨论(0)
  • 2020-11-29 21:36

    Here is how I do it by using HashSet

            HashSet<String> hs = new HashSet<string>(new String[] { "Pluto", "Earth", "Neptune" });
            String[] arr =
            {
                "Pluto",
                "Earth",
                "Neptune",
                "Jupiter",
                "Saturn",
                "Mercury",
                "Pluto",
                "Earth",
                "Neptune",
                "Jupiter",
                "Saturn",
                "Mercury",
                // etc.
            };
            ICollection<String> coll = arr;
    
            String[] arrStrFiltered = coll.Where(str => hs.Contains(str)).ToArray();
    

    HashSet is basically almost to O(1) so your complexity remains O(n).

    0 讨论(0)
  • 2020-11-29 21:37

    Use

    where list.Contains(item.Property)
    

    Or in your case:

    var foo = from codeData in channel.AsQueryable<CodeData>()
              where codeIDs.Contains(codeData.CodeId)
              select codeData;
    

    But you might as well do that in dot notation:

    var foo = channel.AsQueryable<CodeData>()
                     .Where(codeData => codeIDs.Contains(codeData.CodeId));
    
    0 讨论(0)
提交回复
热议问题