Я почесываю голову на этом. Приведенный ниже код, я думаю, должен давать те же результаты. Однако они этого не делают. Мне явно чего-то не хватает. Запрос LINQ возвращает длину, которая меньше, чем обычный код C#.Различные результаты LINQ vs 'normal' C# code
public static long GetListSize(SPList list)
{
long longInt = 0;
long byteSize = (from item in list.Items.OfType<SPListItem>()
where item.ParentList.EnableVersioning == false
select long.TryParse(item["File_x0020_Size"].ToString(), out longInt) ? longInt : 0)
.Concat(from iItem in list.Items.OfType<SPListItem>()
where iItem.ParentList.EnableVersioning == true && iItem.Versions.Count > 1
from vItem in iItem.Versions.OfType<SPListItemVersion>()
select long.TryParse(vItem["File_x0020_Size"].ToString(), out longInt) ? longInt : 0)
.Sum();
return byteSize;
}
public static long GetListSize2(SPList list)
{
long byteSize = 0;
long fileSize = 0;
foreach (SPListItem item in list.Items)
{
if (item.ParentList.EnableVersioning == true && item.Versions.Count > 1)
{
for (int i = 0; i < item.Versions.Count; i++)
{
long.TryParse(item.Versions[i]["File_x0020_Size"].ToString(), out fileSize);
byteSize += fileSize;
}
}
else
{
long.TryParse(item["File_x0020_Size"].ToString(), out fileSize);
byteSize += fileSize;
}
}
return byteSize;
}
Когда я запускаю их против того же списка:
GetListSizeForCurrentItems: 2401408086
GetListSizeForCurrentItems2: 2401408086
GetListSizeForItemVersions: 459902667
GetListSizeForItemVersions2: 459902667
GetListSize: 459902667
GetListSize2: 2842896668
Refactored код для изоляции каждого запроса в приведенном выше:
public static long GetListSizeForItemVersions(SPList list)
{
long longInt = 0;
long byteSize = (from iItem in list.Items.OfType<SPListItem>()
where iItem.ParentList.EnableVersioning == true && iItem.Versions.Count > 1
from vItem in iItem.Versions.OfType<SPListItemVersion>()
select long.TryParse(vItem["File_x0020_Size"].ToString(), out longInt) ? longInt : 0)
.Sum();
return byteSize;
}
public static long GetListSizeForItemVersions2(SPList list)
{
long byteSize = 0;
long fileSize = 0;
foreach (SPListItem item in list.Items)
{
if (item.ParentList.EnableVersioning == true && item.Versions.Count > 1)
{
for (int i = 0; i < item.Versions.Count; i++)
{
long.TryParse(item.Versions[i]["File_x0020_Size"].ToString(), out fileSize);
byteSize += fileSize;
}
}
}
return byteSize;
}
public static long GetListSizeForCurrentItems(SPList list)
{
long longInt = 0;
long byteSize = (from item in list.Items.OfType<SPListItem>()
where item.ParentList.EnableVersioning == false
select long.TryParse(item["File_x0020_Size"].ToString(), out longInt) ? longInt : 0)
.Sum();
return byteSize;
}
public static long GetListSizeForCurrentItems2(SPList list)
{
long byteSize = 0;
long fileSize = 0;
foreach (SPListItem item in list.Items)
{
long.TryParse(item["File_x0020_Size"].ToString(), out fileSize);
byteSize += fileSize;
}
return byteSize;
}
Переход к Concat() определенно меняет результаты.
Дополнительный набор глаз был бы полезен. Что мне не хватает при переводе простого C# в LINQ.
Помимо использования Союза вместо Concat, вы в том числе EnableVersioning == ложных значений в первой части запроса, в то время как в вашем обычном C# кода вы используя «else», чтобы только один элемент мог внести * одну * часть суммы. –
Привет, Джон, ты прав насчет другого (и Союза/Конката). Однако, если я добавлю предложение where в первую часть запроса с EnableVersioning == false, я получаю довольно большую разницу в результатах. Я собираюсь обновить вопрос, чтобы отразить то, что происходит сейчас. – Taoism
Обратите внимание, что нам было бы легче помочь вам, если бы вы могли предоставить короткий, но * полный * пример и удалить все посторонние (например, синтаксический анализ строк - вы уверены, что это даже требуется?) –