Entity Framework - присоединиться к списку - PullRequest
2 голосов
/ 08 ноября 2011

Мне нужно получить список объектов из моей базы данных, который соответствует списку элементов в простом списке (не EF). Возможно ли это с Entity Framework 4.1?

Пример:

var list = new List<string> { "abc", "def", "ghi" };
var items = from i in context.Items
            where list.Contains(i.Name)
            select i;

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

var list = new List<Tuple<string, string>>
{
    new Tuple<string,string>("abc", "123"),
    new Tuple<string,string>("def", "456")
};

// i need to write a query something like this:
var items = from i in context.Items
where list.Contains(new Tuple<string,string>(i.Name, i.Type))
select i;

Я знаю, что это недопустимо, потому что будет сказано, что это должен быть примитивный тип, но есть ли способ сделать то, что я пытаюсь выполнить, или мне нужно будет прибегнуть к хранимой процедуре?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2011

У вас есть несколько вариантов:

1) Конечно, вы можете написать хранимую процедуру, чтобы сделать то, что вам нужно, и вызвать ее.

2) Вы можете прочитать таблицу в память и затем запросить список в памяти ... таким образом, вам не нужно использовать примитивы:

var items = from i in context.Items.ToList()
            where list.Contains(new Tuple<string, string>(i.Name, i.Type))
            select i;

3) Вы также можете преобразовать свой запрос, чтобы использовать примитивы для достижения той же цели:

var items = from i in context.Items
            join l in list
            on new { i.Name, i.Type } equals 
                new { Name = l.Item1, Type = l.Item2 }
            select i;

Я бы выбрал второй вариант, если таблица не очень большая. В противном случае переходите к первому.

0 голосов
/ 08 ноября 2011

Вам нужно подумать о том, как будет выглядеть результирующий SQL, это будет трудно сделать напрямую в SQL.

Я бы предложил, чтобы вы разбили одно поле кортежей и использовали его для сокращениясписок результатов, верните результат запроса, затем снова отфильтруйте, чтобы соответствовать одному из кортежей, например

var list = new List<string> { "abc", "def" };
var list2 = new List<Tuple<string, string>>
{
  new Tuple<string,string>("abc", "123"),
  new Tuple<string,string>("def", "456")
};
var items = (from i in context.Items
        where list.Contains(i.Name)
        select i)
        .AsEnumerable()
        .Where(i => list2.Any(j => j.val1 == i.Name && j.val2 == i.Type);
0 голосов
/ 08 ноября 2011

Вы должны разбить его на подсвойства.Например, что-то вроде (это может не скомпилироваться, я не могу проверить в данный момент, но это должно дать вам что-то для работы):

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