У меня есть таблица с тремя столбцами. PK. В таблице хранится информация о файлах в каталоге.получить разницу между наборами IQueryable
У меня есть каталог файлов в качестве моего ввода.
Целью является получение списка файлов, которые были добавлены, и тех, которые удалены.
У меня есть следующий код:
string uri = "ftp://ftp.myftpsite.com/files";
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
using (myEntities context = new myEntities())
{
IQueryable<ITEM> storedItems = from item in context.ITEMs where item.YEAR == "2013" select item;
List<ITEM> currentItemList = new List<ITEM>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line) && line.EndsWith(".htm"))
{
ITEM item = new ITEM();
item.YEAR = line.Substring(0,4);
item.NUM = line.Substring(7,5);
currentItemList.Add(item);
line = streamReader.ReadLine();
}
IQueryable<ITEM> currentItems = currentItemList.AsQueryable<ITEM>();
IQueryable<ITEM> newItems = from item in currentItems where !(from storedItem in storedItems select storedItem.YEAR + storedItem.NUM).Contains(item.YEAR + item.NUM) select item;
IQueryable<ITEMS> removedItems = from item in storedItems where !(from currentItem in currentItems select currentItem.YEAR + currentItem.NUM).Contains(item.YEAR + item.NUM) select item;
List<ITEM> newItemsList = newItems.ToList();
List<ITEM> removedItemsList = removedItems.ToList();
}
В конце newItems
должны быть элементы на сайте FTP, а не базы данных и removedItems
должны быть элементы в базе данных, а не на сайте FTP.
В newItems
работает, но следующая строка возвращает ошибку: List<ITEM> removedItemsList = removedItems.ToList();
Ошибка является:
System.NotSupportedException: Unable to create a constant value of type 'MYProject.ITEM'. Only primitive types or enumeration types are supported in this context.
Что-то не так с моей второй LINQ запрос, я думаю, но я не уверен, какие.
Кроме того, производительность важна, поэтому предложения по эффективности приветствуются.
Текущее решение:
List<string> criteria = (from item in currentItemList select item.YEAR + item.NUM).ToList();
foreach(AMENDMENT a in storedItems)
{
if(!criteria.Contains(a.YEAR + a.NUM))
//do stuff here
}
Так в основном, вместо того, чтобы делать условное заявление, в LINQ я сделал это в заявлении, если в цикле. Я честно считаю, что это довольно уродливо, однако у него есть две выгоды.
Он работает
Вместо Ф.О. принимать около 3 секунд, как запросы LINQ были, это занимает несколько сотых долей секунды.
Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –
Почему он работает для запроса newItems, а не запроса removeItems? Это по сути тот же запрос? – kralco626