मेरे पास एक एप्लिकेशन है जिस पर मैं काम कर रहा हूं जहां मुझे रिकॉर्ड खोजने और प्रदर्शित करने में सक्षम होना चाहिए; पेजिंग के साथ।

मेरे पास एक तरीका है जो सभी रिकॉर्ड खींच लेगा और उन्हें पेजिंग के साथ ठीक से प्रदर्शित करेगा। यह खोज है जो SQL डेटाबेस पक्ष पर कार्यों में एक रिंच फेंकती प्रतीत होती है।

मेरे पास sql का उपयोग करके var listQuery है, और linq का उपयोग करके var listQuery2 है। मैं इसके बजाय linq का उपयोग करूंगा, लेकिन यह मुझे sql क्वेरी के रूप में सभी समान फ़ील्ड को पॉप्युलेट करने में भी परेशानी दे रहा है।

मैं जो हासिल करने की कोशिश कर रहा हूं वह यह है कि जब मैं सॉर्ट करता हूं, 'if (!string.IsNullOrEmpty(partParams.SearchString))' आइटम की सूची को देखता है, जो मेल खाते हैं और सूची को पेजेडलिस्ट से वापसी में पास करते हैं तरीका।

मैं 3 टेबल (भाग, ब्रांड, सप्लायर) से खींच रहा हूं और दो प्रमुख टेबल (पार्टब्रांड, पार्टसप्लायर) प्राथमिक कुंजी फ़ील्ड का उपयोग करता हूं। जब रिकॉर्ड डीबी से खींचे जाते हैं, तो मैं उन्हें एक नई इकाई में जोड़ता हूं जिसका उपयोग विशिष्ट फ़ील्ड (MaterialPart) प्रदर्शित करने के लिए किया जाता है। खोज का उपयोग नहीं करते समय Var listQuery काम ढूंढता है। सभी रिकॉर्ड वापस आते हैं, ठीक से पृष्ठांकित होते हैं। Var listQuery2 पूर्ण नहीं है क्योंकि मैं मर्ज किए गए निकाय को सेट करना चाहता हूं, लेकिन मुझे डेटा से संबंधित समस्या हो रही है।

यदि आवश्यक हो, तो मैं स्पष्टता के साथ सहायता के लिए वर्ग संस्थाओं को जोड़ सकता हूँ।

        public async Task<PagedList<MaterialPart>> GetMaterialParts(PartParams partParams)
        {
            var listQuery = from p in _dbcontext.Parts
                            join ps in _dbcontext.PartsSuppliers on p.Id equals ps.PartId
                            join s in _dbcontext.Suppliers on ps.SupplierId equals s.Id
                            join pb in _dbcontext.PartsBrands on p.Id equals pb.PartId
                            join b in _dbcontext.Brands on pb.BrandId equals b.Id
                            select (new MaterialPart
                            {
                                PartId = p.Id,
                                PartNumber = p.PartNumber,
                                Description = p.Description,
                                SupplierId = s.Id,
                                SupplierName = s.SupplierName,
                                BrandId = b.Id,
                                BrandName = b.BrandName,
                                Cost = ps.Cost
                            });

            var listQuery2 = _dbcontext.Parts
                    .Include(x => x.PartBrands)
                        .ThenInclude(x => x.Brand)
                    .Include(x => x.PartSuppliers)
                        .ThenInclude(x => x.Supplier)
                    .Select(t => new MaterialPart
                    {
                        PartId = t.Id,
                        PartNumber = t.PartNumber,
                        Description = t.Description
                    });

            if (!string.IsNullOrEmpty(partParams.SearchString))
            {
                listQuery = listQuery
                    .AsQueryable()
                    .Where(x => x.PartNumber
                        .Contains(partParams.SearchString, StringComparison.OrdinalIgnoreCase)
                    || x.Description
                        .Contains(partParams.SearchString, StringComparison.OrdinalIgnoreCase));
            }

            return await PagedList<MaterialPart>.CreateAsync(listQuery,
                partParams.PageNumber,
                partParams.PageSize);

        }

डाकिया में मेरा एपीआई यूआरएल निम्न जैसा दिखता है:

http://localhost:5001/api/materials?pageNumber=1&pageSize=5&searchString=100-

एसक्यूएल सर्वर त्रुटि

System.InvalidOperationException: The LINQ expression 'DbSet<Part>
    .Join(
        outer: DbSet<PartSupplier>, 
        inner: p => p.Id, 
        outerKeySelector: p0 => p0.PartId, 
        innerKeySelector: (p, p0) => new TransparentIdentifier<Part, PartSupplier>(
            Outer = p, 
            Inner = p0
        ))
    .Join(
        outer: DbSet<Supplier>, 
        inner: ti => ti.Inner.SupplierId, 
        outerKeySelector: s => s.Id, 
        innerKeySelector: (ti, s) => new TransparentIdentifier<TransparentIdentifier<Part, PartSupplier>, Supplier>(
            Outer = ti, 
            Inner = s
        ))
    .Join(
        outer: DbSet<PartBrand>, 
        inner: ti0 => ti0.Outer.Outer.Id, 
        outerKeySelector: p1 => p1.PartId, 
        innerKeySelector: (ti0, p1) => new TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<Part, PartSupplier>, Supplier>, PartBrand>(
            Outer = ti0, 
            Inner = p1
        ))
    .Join(
        outer: DbSet<Brand>, 
        inner: ti1 => ti1.Inner.BrandId, 
        outerKeySelector: b => b.Id, 
        innerKeySelector: (ti1, b) => new TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<Part, PartSupplier>, Supplier>, PartBrand>, Brand>(
            Outer = ti1, 
            Inner = b
        ))
    .Where(ti2 => ti2.Outer.Outer.Outer.Outer.PartNumber.Contains(
        value: __partParams_SearchString_0, 
        comparisonType: OrdinalIgnoreCase) || ti2.Outer.Outer.Outer.Outer.Description.Contains(
        value: __partParams_SearchString_0, 
        comparisonType: OrdinalIgnoreCase))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
   at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.<VisitMethodCall>g__CheckTranslated|8_0(ShapedQueryExpression translated, <>c__DisplayClass8_0& )
   at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_0`1.<ExecuteAsync>b__0()
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, Expression expression, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.CountAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
   at pMinder4.API.Helpers.PagedList`1.CreateAsync(IQueryable`1 source, Int32 pageNumber, Int32 pageSize) in C:\Users\lsieting\Documents\Source\repos\pMinder4\pMinder4.API\Helpers\PagedList.cs:line 27
   at pMinder4.API.Data.MaterialRepository.GetMaterialParts(PartParams partParams) in C:\Users\lsieting\Documents\Source\repos\pMinder4\pMinder4.API\Data\MaterialRepository.cs:line 95
   at pMinder4.API.Controllers.MaterialsController.GetMaterialParts(PartParams partParams) in C:\Users\lsieting\Documents\Source\repos\pMinder4\pMinder4.API\Controllers\MaterialsController.cs:line 30
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

0
lsieting 4 जून 2020, 00:14

1 उत्तर

सबसे बढ़िया उत्तर

इस तरह तुलना को सरल बनाने का प्रयास करें:

listQuery = listQuery
                    .AsQueryable()
                    .Where(x => x.PartNumber.ToLower()
                        .Contains(partParams.SearchString.ToLower())
                    || x.Description.ToLower()
                        .Contains(partParams.SearchString.ToLower()));

इस प्रकार का फ़िल्टर .Contains(partParams.SearchString, StringComparison.OrdinalIgnoreCase) लिंक टू एंटिटीज पर काम नहीं करता है।

आशा है कि इससे सहायता मिलेगी!

1
devcrp 4 जून 2020, 00:28