Golden Basim Ответов: 2

Как заменить значение в запросе select строкой из ресурсов ?


привет,

как заменить значение в запросе select строкой из ресурсов, подобных этому примеру:

strings.ResourceManager.GetString(s.StartStatus, strings.Culture);


Что я уже пробовал:

я попробовал это сделать :

var Query = DB1.view_items_history
            .Where(u => u.stitems_ID == itemID &&  u.OpDate >= From && u.OpDate <= To)
            .Select(s => new CLSItemsHistory
            {
                stitems_ID = s.stitems_ID,
                stitems_Status = s.stitems_Status,
                stitems_Name = s.stitems_Name,
                stitems_Type = s.stitems_Type,
                stitems_Type_name = s.stitems_Type == 0 ? strings.STOCKS : s.stitems_Type == 1 ? strings.STOCKS_WITH_SERIAL : "",
                stitems_Code = s.stitems_Code,
                stitems_NationalCode = s.stitems_NationalCode,
                DetunitID = s.DetunitID,
                UnitName = s.UnitName,
                ID = s.ID,
                mID = s.mID,
                OpType = s.OpType,
                OpName = strings.ResourceManager.GetString(s.OpType, strings.Culture),
                OpDate = s.OpDate,
                r_branche_ID = s.r_branche_ID,
                branche_Name = s.branche_Name,
                IncmQnt = s.IncmQnt,
                OutQnt = s.OutQnt,
                cost = s.cost,
                TotalCost = s.TotalCost,
                FromStore = s.FromStore,
                fstore_Name = s.fstore_Name,
                ToStore = s.ToStore,
                tstore_Name = s.tstore_Name,
                StartStatus = strings.ResourceManager.GetString(s.StartStatus, strings.Culture),
                EndStatus = strings.ResourceManager.GetString(s.EndStatus, strings.Culture)

            });


но эта ошибка появляется :

Система.NotSupportedException: 'LINQ to Entities не распознает метод 'system.Строка GetString(System.Строка, Система.Глобализация.CultureInfo)' метод, и этот метод не может быть переведен в выражение хранилища'.

2 Ответов

Рейтинг:
0

Dave Kreskowiak

Все очень просто. Назначьте значение ResourceManager.GetString вызовите строковую переменную вне выражения LINQ, а затем просто используйте эту переменную вместо всего вашего ResourceManager.GetString звонки.

Причина, по которой вы получаете это сообщение, заключается в том, что базовый компонент database engine понятия не имеет, что такое ResourceManager и как перевести любой вызов к нему в SQL-код.


Golden Basim

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

List<CLSItemsHistory> dList = new List<CLSItemsHistory>();

Dave Kreskowiak

Ты же не серьезно...

string osTypeString = strings.ResourceManager.GetString(s.OpType, strings.Culture);

Тогда вы просто используете osTypeString в месте вашего звонка, чтобы getString в инструкции LINQ.

То же самое касается вашего StartStatus и EndStatus.

Golden Basim

мне очень жаль, но это не ясно для меня.. результаты имеют тысячи записей, которые имеют сотни типов (которые нужно перевести)

Dave Kreskowiak

Вы, по-видимому, смотрите на что-то совершенно отличное от того, что я есть, и от того, что было указано в вашем первоначальном вопросе.

Все, о чем я говорю, - это извлечение строки из ресурсов и использование ее в запросе LINQ.

Я вообще ничего не говорю о вашем списке "clsitemshistory".

Рейтинг:
0

Richard Deeming

Весь код, который ссылается на ResourceManager нужно работать в памяти, а не в базе данных.

Добавить .AsEnumerable() звонок между двумя .Where(...) и .Select(...) инструкции для принудительного выполнения проекции в памяти:

var Query = DB1.view_items_history
            .Where(u => u.stitems_ID == itemID && u.OpDate >= From && u.OpDate <= To)
            .AsEnumerable()
            .Select(s => new CLSItemsHistory
            {
                stitems_ID = s.stitems_ID,
                stitems_Status = s.stitems_Status,
                stitems_Name = s.stitems_Name,
                stitems_Type = s.stitems_Type,
                stitems_Type_name = s.stitems_Type == 0 ? strings.STOCKS : s.stitems_Type == 1 ? strings.STOCKS_WITH_SERIAL : "",
                stitems_Code = s.stitems_Code,
                stitems_NationalCode = s.stitems_NationalCode,
                DetunitID = s.DetunitID,
                UnitName = s.UnitName,
                ID = s.ID,
                mID = s.mID,
                OpType = s.OpType,
                OpName = strings.ResourceManager.GetString(s.OpType, strings.Culture),
                OpDate = s.OpDate,
                r_branche_ID = s.r_branche_ID,
                branche_Name = s.branche_Name,
                IncmQnt = s.IncmQnt,
                OutQnt = s.OutQnt,
                cost = s.cost,
                TotalCost = s.TotalCost,
                FromStore = s.FromStore,
                fstore_Name = s.fstore_Name,
                ToStore = s.ToStore,
                tstore_Name = s.tstore_Name,
                StartStatus = strings.ResourceManager.GetString(s.StartStatus, strings.Culture),
                EndStatus = strings.ResourceManager.GetString(s.EndStatus, strings.Culture)
            });


Golden Basim

спасибо , это повлияет на производительность ?? ,, я использую skip() для извлечения только ограниченных записей, если я использовал .AsEnumerable() он будет извлекать все записи перед Skip() ?

Richard Deeming

Да, если вы позвоните .AsEnumerable() во-первых, тогда он получит все записи. Ты захочешь позвонить OrderBy, Skip, и Take перед вызовом AsEnumerable.

Golden Basim

спасибо я попробую прямо сейчас