Посоветуйти правильную конструкцию LINQ
От: maxidroms Россия  
Дата: 23.09.08 09:37
Оценка:
К примеру есть класс, который является сущностью EntityFramework
public class User
{
public string username;
public DateTime age;
public int Weight;
}

вопщем что то вроде

есть один список
List<User> firstList;
и есть второй список
List<User> secondList;

Если мне необходимо выбрать одно значение из списка то понятно,
firstList.Where(f => f.username == "MyName");

А если мне необходимо выбрать из списка список
firstList.Where(f => secondList.Contains(f.username))

но т.к. это объект EF, то получаю ошибку
"LINQ to Entities does not recognize the method and this method cannot be translated into a store expression."


т.е. с обычными LINQ данными — списки, массивы и т.д. — это работает..
как сделать Мэни ту Мэни запрос для EF ???

Щас вот такой изврат использую:
foreach (string state in states)
{
w = string.Format("{0} it.CurrentStateName==\"{1}\" ||", w, state);
}

w = !w.IsEmpty() ? w.Remove(w.Length — 3) : "1 == 1";
Entity.InstanceState.Where(w)

но это уж страшные хаки...
Re: Посоветуйти правильную конструкцию LINQ
От: Аlexey  
Дата: 23.09.08 09:53
Оценка:
Здравствуйте, maxidroms, Вы писали:


M>К примеру есть класс, который является сущностью EntityFramework

M>public class User
M>{
M> public string username;
M> public DateTime age;
M> public int Weight;
M>}

M>вопщем что то вроде


M>есть один список

M>List<User> firstList;
M>и есть второй список
M>List<User> secondList;

M>Если мне необходимо выбрать одно значение из списка то понятно,

M>firstList.Where(f => f.username == "MyName");

M>А если мне необходимо выбрать из списка список

M>firstList.Where(f => secondList.Contains(f.username))

M>но т.к. это объект EF, то получаю ошибку

M>"LINQ to Entities does not recognize the method and this method cannot be translated into a store expression."


M>т.е. с обычными LINQ данными — списки, массивы и т.д. — это работает..

M>как сделать Мэни ту Мэни запрос для EF ???

M>Щас вот такой изврат использую:

M>foreach (string state in states)
M>{
M> w = string.Format("{0} it.CurrentStateName==\"{1}\" ||", w, state);
M>}

M>w = !w.IsEmpty() ? w.Remove(w.Length — 3) : "1 == 1";

M>Entity.InstanceState.Where(w)

M>но это уж страшные хаки...


может join подойдет?

        var res = from user1 in firstList
                  join user2 in secondList on user1.username equals user2.username
                  select user1;
Re[2]: Посоветуйти правильную конструкцию LINQ
От: maxidroms Россия  
Дата: 23.09.08 21:42
Оценка:
А>может join подойдет?

А>
А>        var res = from user1 in firstList
А>                  join user2 in secondList on user1.username equals user2.username
А>                  select user1;
А>


Нет.
Повторюсь... дело в связке EF и обычного LINQ
Re[3]: Посоветуйти правильную конструкцию LINQ
От: Аlexey  
Дата: 24.09.08 08:11
Оценка:
Здравствуйте, maxidroms, Вы писали:


А>>может join подойдет?


А>>
А>>        var res = from user1 in firstList
А>>                  join user2 in secondList on user1.username equals user2.username
А>>                  select user1;
А>>


M>Нет.

M>Повторюсь... дело в связке EF и обычного LINQ

В EF Contains не работает. Похоже что MS торопились с выпуском EF и не реализовали некоторую функциональность, в частности трансляцию Contains в SQL код.
Re[4]: Посоветуйти правильную конструкцию LINQ
От: IgorLopotov  
Дата: 15.10.08 20:50
Оценка:
Здравствуйте, Аlexey, Вы писали:

А>Здравствуйте, maxidroms, Вы писали:



А>>>может join подойдет?


А>>>
А>>>        var res = from user1 in firstList
А>>>                  join user2 in secondList on user1.username equals user2.username
А>>>                  select user1;
А>>>


M>>Нет.

M>>Повторюсь... дело в связке EF и обычного LINQ

А>В EF Contains не работает. Похоже что MS торопились с выпуском EF и не реализовали некоторую функциональность, в частности трансляцию Contains в SQL код.


Таки не работает.
Как это обойти можно найти здесь
http://forums.microsoft.com/Forums/ShowPost.aspx?PostID=3994925&amp;SiteID=1
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.