У меня есть таблица User и Items, где существует множество ко многим отношениям в таблице List (которая содержит UserId и ItemId). Теперь я пытаюсь получить для каждого элемента, всех его пользователей. Схема для таблицВыполнение запроса linq, аналогичного формату словаря, с помощью groupby для извлечения значения из другого списка
CREATE TABLE dbo.Item
(
itemid int identity(1,1) not null,
Item_Name varchar(30) not null,
PRIMARY KEY (itemid)
);
CREATE TABLE dbo.List
(
itemid int not null,
Userid varchar(11) not null,
);
таблица Пользователь также имеет ту же схему, как элементу таблицы, но Userid имеет тип VARCHAR (11). имя строки подключения является MyEntities
MyEntities obj = new MyEntities();
Запрос LINQ имеет формат
var test1 = from p in obj.User
from k in p.Item
where p.Userid == Userid //retrieving the items for a particular user
select itemRes { itemid = k.itemid };
IEnumerable<itemRes> itemret = test1.ToList();
var query = from p in obj.User
from k in p.Item
group p.Userid by itemret.Contains(k.itemid) into g// error1
select new Result { fitemid = g.Key, fUserid = g.ToList() };
IEnumerable<Result>output = query.ToDictionary(fitemid, fUserid);//error2
Первый запрос отлично работает, а второй запрос выбрасывает ошибку компиляции Здесь возникают ошибки следующим образом
Ошибка1: IEnumerable не содержит определения для «Содержит»
Ошибка2: T он назвал fitemid не существует в текущем контексте, имя fUserid не существует в текущем контексте
Класс выглядит следующим образом
public class Result
{
public int fitemid { get; set; }
public List<string> fUserid { get; set; }
}
Я новичок в понятиях Linq, поэтому я, если мой синтаксис не знаю и определение правильное или нет. Я написал первый запрос для извлечения списка элементов. Во втором запросе для каждого из элементов в списке я получаю пользователей каждого конкретного элемента.
Пожалуйста, помогите мне в выпрямления запрос ....
Update1:. Я был неправ о преобразовании запроса в формат ToDictionary @ Гусман и @Alex указал мне в правильном направлении, так что я преобразовал второй запрос в
IEnumerable<Result> query = from p in obj.User
from k in p.Item
group p.Userid by itemret.Contains(k.itemid) into g// error1
select new Result { fitemid = g.Key, fUserid = g.ToList() };
и Error2 ушел
Update 2: Для убр е Error1, я сделал то, что @ kwan245 сказал
MyEntities obj = new MyEntities();
var test1 = from p in obj.User
from k in p.Item
where p.Userid == Userid //retrieving the items for a particular >user
select k.itemid ;
IEnumerable<int> itemret = test1.ToList();
и второй запрос, как это
IEnumerable<Result> query = from p in obj.User
from k in p.Item
where itemret.Contains(k.itemid)
group p.Userid by k.itemid into g// new error
select new Result { fitemid = g.Key, fUserid = g.ToList() };
новую ошибку, которая выскочила является: LINQ к Entities не распознает метод «System.Collections .Generic.List 1[System.String] ToList[String](System.Collections.Generic.IEnumerable
1 [System.String]) ', и этот метод не может быть переведен в выражение хранилища
Возможно, это связано с неправильным синтаксисом, но какой будет правильный ответ
У вас есть "с помощью System.Linq" в начале файла? – Gusman
Да, конечно, в противном случае первый запрос не будет работать, правильно ??? – Amalpriya
Нет, это сработает, если класс User является IQueriable. метод Contains является расширением IEnumerable в System.Linq, если он не существует, это должно быть потому, что пространство имен System.Linq не ссылается ... – Gusman