세 개의 열이있는 테이블이 있습니다. 두 개의 열이 PK를 구성합니다. 이 테이블은 디렉토리에있는 파일에 대한 정보를 저장합니다.IQueryable 집합간에 차이가 발생합니다.
입력 파일로 디렉토리가 있습니다.
목표는 추가 된 파일 목록과 제거 된 파일 목록을 얻는 것입니다. 결국 newItems
에서
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();
}
는 FTP 사이트의 항목이 아니라에게 데이터베이스를해야하고 removedItems
이 항목 FTP 사이트의 데이터베이스에서가 아니라해야한다 :
나는 다음과 같은 코드가 있습니다.
newItems
작동하지만 다음 줄은 오류 반환 :
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<ITEM> removedItemsList = removedItems.ToList();
오류가이다 뭐.
또한 성능이 중요하므로 성능과 관련된 제안을 환영합니다.
현재 솔루션 :
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에서 조건문을하고 나는 for 루프의 if 문에 그것을했다. 정직하게 생각하면 꽤 못생긴 데 두 가지 이점이 있습니다.
그것은 LINQ 쿼리처럼 약 3 초 정도 복용했다 대신 fo를
, 그것은 두 번째의 몇 백분의 소요 작동합니다.
제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –
removeItems 쿼리가 아닌 newItems 쿼리가 작동하는 이유는 무엇입니까? 본질적으로 동일한 쿼리입니까? – kralco626