Как перевести SQL "ГДЕ expr IN (запрос)" в LINQ? - PullRequest
4 голосов
/ 22 декабря 2010

В основном я хочу сделать этот запрос SQL с linq:

SELECT * 
FROM Orders 
WHERE Identifier IN (SELECT DISTINCT [Order] FROM OrderRows WHERE Quantity = '1')

Вот что я придумал:

var q = from o in db.Orders 
     where o.Identifier in (from r in db.OrderRows 
                           where r.Quantity == 1 select r.Order).Distinct());

Но в после o.Identifier недействителен.

Каков правильный синтаксис для ключевого слова IN?

Ответы [ 6 ]

1 голос
/ 22 декабря 2010

Я немного опоздал, но я сделал демо!

Как уже говорили другие люди, я всегда использую Содержит:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ContainsExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var foos = new List<Foo>
            {
                new Foo { ID = 1, FooName = "Light Side" },
                new Foo { ID = 2, FooName = "Dark Side" }
            };

            var bars = new List<Bar>
            {
                new Bar { ID = 1, BarName = "Luke", FooID = 1 },
                new Bar { ID = 2, BarName = "Han", FooID = 1 },
                new Bar { ID = 3, BarName = "Obi-Wan", FooID = 1 },
                new Bar { ID = 4, BarName = "Vader", FooID = 2 },
                new Bar { ID = 5, BarName = "Palpatine", FooID = 2 },
                new Bar { ID = 6, BarName = "Fett", FooID = 2 },
                new Bar { ID = 7, BarName = "JarJar", FooID = 3 }
            };

            var criteria = from f in foos
                           select f.ID;

            var query = from b in bars
                        where criteria.Contains(b.FooID)
                        select b;

            foreach (Bar b in query)
            {
                Console.WriteLine(b.BarName);
            }

            Console.WriteLine();
            Console.WriteLine("There should be no JarJar...");

            Console.ReadLine();
        }
    }

    public class Foo
    {
        public int ID { get; set; }
        public string FooName { get; set; }
    }

    public class Bar
    {
        public int ID { get; set; }
        public string BarName { get; set; }
        public int FooID { get; set; }
    }   
}
1 голос
/ 22 декабря 2010

Похоже, вы хотите присоединиться:

var q = (from o in db.Orders
        join r in db.OrderRows on o.Identifier equals r.Order
        where r.Quantity == 1
        select o).Distinct();
1 голос
/ 22 декабря 2010
    from o in db.Orders 
    where o.Identifier.Any
      (
        from r in db.OrderRows 
        where r.Quantity == 1 
        select r.Order
      ).Distinct()
    select o

Попробуйте это ...

0 голосов
/ 22 декабря 2010

Короткий ответ: вы хотите воспользоваться преимуществом метода Contains.

int[] ids = { 2, 5, 6, 1 };

var a = from myRecords in context.db
where ids.Contains (myRecords.id)
select new {Id = myRecords.id};

Фильтрация по двум наборам результатов работает одинаково, поскольку вы можете фильтровать любое общее свойство, совместно используемоедва комплекта:

string[] cities = { "London", "Paris", "Seattle" };
var query = dataContext.Customers.Where (c => cities.Contains (c.City));
0 голосов
/ 22 декабря 2010
var q = from o in db.Orders 
     where (from r in db.OrderRows 
            where r.Quantity == 1 select r.Order).Distinct().Contains(o.Identifier);
0 голосов
/ 22 декабря 2010

вы пытались использовать что-то вроде этого:

int[] inKeyword = { 5, 7, 9 };
var q = from o in db.Orders.Where(p => inKeyword.Contains(p.Identifier));

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...