Expression Tree қатесі: Түрдің тұрақты мәнін жасау мүмкін емес

Міне, қате: 'mvcinfosite.ViewModels.GrpSearchHolder' түрінің тұрақты мәнін жасау мүмкін емес. Бұл контекстте тек қарабайыр түрлері (мысалы, Int32, String және Guid) қолданылады.

Бұл қатені қалай шешуге болады? Мен сіздердің проблемаларыңызды көрсетуге тырысамын. Менің нақты жобамда MyGrp1, MyGrp2, MyGrp3 тізімі ListBox дегенмен ауыстырылады. Мен деректерді сүзгілеу үшін пайдаланамын.

        public class MyGroupHolder
        {
            public string GrpName { get; set; }
            public List ListGrpHolder = new List();

            //Imagine a 3 listbox (MyGrp1,MyGrp2,MyGrp3) 
            //Each listbox contains selected value.
            MyGroupHolder MyGrp1 = new MyGroupHolder();
            MyGrp1.GrpName = "Grp 1 Test";
            MyGrp1.ListSelectedGrpDescID = new List ListGrpHolder.Any(pg => pg.ListSelectedGrpDescID.Count == 0 || p.GroupLocations.Select(sg => sg.GrpDescID).Intersect(pg.ListSelectedGrpDescID).Any())).ToList();


            return View();
        }
2

3 жауаптар

Өтінішіңізден нысандарды линг-субъектке сұрауларға жібере алмайсыз. Мәндерді алып тастау және оларды шарт ретінде беру керек. Сұрауыңыздың басталуында мәселе көрсетілген:

.Where(p => ListGrpHolder.Any(...

Linq-to-entity сұрауын орындау үшін жауапты SQL сервері дегеніміз ListGrpHolder дегеніміз не екенін білесіз (ол сіздің қолданбаңыздың жадында тұрады) және оның құрамында қандай мән бар?

Мен сіздердің сұраныстарыңызды және не істеу керек екенін толық түсінбеймін, бірақ сіз linq-to-entities және linq-to-objects арасындағы қатаң түрде ерекшеленуі қажет. Біріншісі - SQL серверінде орындалады және сұраудың қарапайым түрлерін ғана жібереді. Екіншісі сіздің өтініміңізде орындалады және сіз оларға кез-келген нысан мен линг құрылысын пайдалана аласыз, бірақ оны SQL серверінен деректермен қолданғыңыз келсе, алдымен олардың барлығын қолданбаңызға жүктеп, қолданбаңыздың жадында сүзгілеу керек сервер.

1
қосылды
Сұрауымды жарамды өрнекте айналдыру үшін теңшелетін өрнекті ағашпен жол бар ма?
қосылды автор Jean-Francois, көзі

пайдалану үшін сұрауыңызды түрлендіріңіз

l-дан db-ге дейін онда mycalculatedlocalids.Contains (l.id) l таңдаңыз;

IQueryable провайдер туралы ақпарат бар және IEnumerable (ListGrpHolder) жоқ. Сондықтан сұрауды sql серверінде іске қосуға болмайды.

0
қосылды

Сұрауды Lambda әдістерінің орнына LINQ пайдалану үшін түрлендірдім. LINQ синтаксисінде жазылған кезде сұрауларды оқып шығу оңайырақ.

db.Location деген pg.ListSelectedGrpDescID.Count == 0 дегенмен байланысты? db.Location дегеніміз не 0 болса, қайтып келуі керек? Сұраудың осы бөлігін қазір қалдырдым.

Шешімді табуға тырысқанда, мәселені қадамдарға дейін сындыру дұрыс болар еді. Бұл шешімге алғашқы қадам.

Біріншіден, ListGrpHolder идентификаторын басқа нұсқада қайта жасай аламыз. Бұл тек int мәнін қайтарады және ListLocation сұрауды оқуды жеңілдетеді.

var SelectedIds = ListGrpHolder.Select(pg => pg.ListSelectedGrpDescID).SelectMany(i => i);
var ListLocation = (from loc in db.Locations
                    from grp in loc.GroupLocations
                    where SelectedIds.Contains(grp.GrpDescID)
                    select loc).ToList();

Егер сізге қажетті нәтижелерді алу үшін сұрауды жеңілдету немесе өзгерту мүмкін болмаса, біз Expression Tree пайдалануды қарастыра аламыз.

0
қосылды