programing

LINQ에서 엔티티로 'System' 메서드를 인식하지 않습니다.String ToString() 메서드입니다.이 메서드는 스토어 식으로 변환할 수 없습니다.

goodcopy 2022. 10. 7. 21:48
반응형

LINQ에서 엔티티로 'System' 메서드를 인식하지 않습니다.String ToString() 메서드입니다.이 메서드는 스토어 식으로 변환할 수 없습니다.

하나의 mysql 서버에서 sql 서버로 몇 가지 작업을 마이그레이션하고 있는데 이 코드를 어떻게 작동시키는지 알 수 없습니다.

using (var context = new Context())
{
    ...

    foreach (var item in collection)
    {
        IQueryable<entity> pages = from p in context.pages
                                   where  p.Serial == item.Key.ToString()
                                   select p;
        foreach (var page in pages)
        {
            DataManager.AddPageToDocument(page, item.Value);
        }
    }

    Console.WriteLine("Done!");
    Console.Read();
}

foreach (var page in pages)하다

LINQ에서 엔티티로 'System' 메서드를 인식하지 않습니다.String ToString() 메서드입니다.이 메서드는 스토어 식으로 변환할 수 없습니다.

왜 이런 일이 일어나는지 아는 사람?

문자열을 temp 변수에 저장하고 식에 사용합니다.

var strItem = item.Key.ToString();

IQueryable<entity> pages = from p in context.pages
                           where  p.Serial == strItem
                           select p;

가 발생하는 은 「」가 원인입니다.ToString()실제로 실행되는 것이 아니라 Method Group으로 변환된 다음 구문 분석 및 SQL로 변환됩니다.없기 때문에ToString()등가 표현은 실패합니다.

주의:

알렉스의 답변도 꼭 확인하세요SqlFunctions이치노많은 경우 임시 변수의 필요성을 제거할 수 있습니다.

다른 사람이 대답한 것처럼, 이것은 때문에 깨집니다.데이터베이스로 이동하는 동안 ToString이 관련 SQL로 변환되지 않습니다.

단, Microsoft는 이러한 상황에서 사용할 수 있는 메서드 집합인SqlFunctions 클래스를 제공합니다.

이 경우 여기서 찾고 있는 것은 SqlFunctions입니다.문자열 변환:

from p in context.pages
where  p.Serial == SqlFunctions.StringConvert((double)item.Key.Id)
select p;

어떤 이유로든 일시적 변수가 있는 솔루션이 바람직하지 않을 때 좋습니다.

SqlFunctions와 마찬가지로 엔티티도 있습니다.데이터 소스에 구애받지 않는 다른 기능 세트(예: SQL)를 제공하는 기능(DbFunctions에 의해 폐지된 EF6 포함)

문제는 LINQ에서 엔티티에 대한 쿼리로 ToString을 호출하고 있다는 것입니다.즉, 파서는 ToString 콜을 동등한 SQL로 변환하려고 합니다(이는 불가능합니다).예외입니다).

ToString 콜을 다른 회선으로 이동하기만 하면 됩니다.

var keyString = item.Key.ToString();

var pages = from p in context.entities
            where p.Serial == keyString
            select p;

비슷한 문제가 있었다.엔티티 컬렉션의 ToList()를 호출하여 목록을 쿼리함으로써 문제를 해결했습니다.컬렉션이 작을 경우 옵션입니다.

IQueryable<entity> pages = context.pages.ToList().Where(p=>p.serial == item.Key.ToString())

이게 도움이 됐으면 좋겠다.

을 「」에 캐스트 .EnumerableLINQ 메서드에는 LINQ를 사용합니다.ToString()다음 중 하나:

    var example = contex.table_name.AsEnumerable()
.Select(x => new {Date = x.date.ToString("M/d/yyyy")...)

해 주세요.AsEnumerable ★★★★★★★★★★★★★★★★★」ToList이 메서드 전에 모든 엔티티에서 모든 데이터를 요청하기 때문입니다.다.table_name1번으로 하다.

Entity Framework Version 6.2.0으로 업그레이드하는 것이 효과적이었습니다.

이전에 버전 6.0.0을 사용하고 있었습니다.

이게 도움이 됐으면 좋겠는데

다음과 같이 변경하면 작동합니다.

var key = item.Key.ToString();
IQueryable<entity> pages = from p in context.pages
                           where  p.Serial == key
                           select p;

foreach는 지연된 실행 기능입니다.즉, LINQ 쿼리는 사용자가 결과에 액세스할 때까지 실행되지 않습니다. 이 은 리고 the 에서 일어납니다.foreach더 일찍은 안 돼

로 「」를 해 주세요.ToString에 식 방문자를 을 "식 "로 수 .ToString적절한 함수를 호출합니다.

using System.Linq;
using System.Data.Entity.SqlServer;
using System.Linq.Expressions;
using static System.Linq.Expressions.Expression;
using System;

namespace ToStringRewriting {
    class ToStringRewriter : ExpressionVisitor {
        static MethodInfo stringConvertMethodInfo = typeof(SqlFunctions).GetMethods()
                 .Single(x => x.Name == "StringConvert" && x.GetParameters()[0].ParameterType == typeof(decimal?));

        protected override Expression VisitMethodCall(MethodCallExpression node) {
            var method = node.Method;
            if (method.Name=="ToString") {
                if (node.Object.GetType() == typeof(string)) { return node.Object; }
                node = Call(stringConvertMethodInfo, Convert(node.Object, typeof(decimal?));
            }
            return base.VisitMethodCall(node);
        }
    }
    class Person {
        string Name { get; set; }
        long SocialSecurityNumber { get; set; }
    }
    class Program {
        void Main() {
            Expression<Func<Person, Boolean>> expr = x => x.ToString().Length > 1;
            var rewriter = new ToStringRewriter();
            var finalExpression = rewriter.Visit(expr);
            var dcx = new MyDataContext();
            var query = dcx.Persons.Where(finalExpression);

        }
    }
}

MVC에서는 요건 또는 정보에 따라 레코드를 검색하고 있다고 가정합니다.정상적으로 동작하고 있습니다.

[HttpPost]
[ActionName("Index")]
public ActionResult SearchRecord(FormCollection formcollection)
{       
    EmployeeContext employeeContext = new EmployeeContext();

    string searchby=formcollection["SearchBy"];
    string value=formcollection["Value"];

    if (formcollection["SearchBy"] == "Gender")
    {
        List<MvcApplication1.Models.Employee> emplist = employeeContext.Employees.Where(x => x.Gender == value).ToList();
        return View("Index", emplist);
    }
    else
    {
        List<MvcApplication1.Models.Employee> emplist = employeeContext.Employees.Where(x => x.Name == value).ToList();
        return View("Index", emplist);
    }         
}

이 경우에도 같은 오류가 발생하였습니다.

var result = Db.SystemLog
.Where(log =>
    eventTypeValues.Contains(log.EventType)
    && (
        search.Contains(log.Id.ToString())
        || log.Message.Contains(search)
        || log.PayLoad.Contains(search)
        || log.Timestamp.ToString(CultureInfo.CurrentUICulture).Contains(search)
    )
)
.OrderByDescending(log => log.Id)
.Select(r => r);

디버깅에 너무 많은 시간을 소비한 결과 논리식에 오류가 나타난 것을 알게 되었습니다.

번째 줄 " " "search.Contains(log.Id.ToString())만, 행에 DateTime 오브젝트가 비참하게 했습니다.DateTime 오브젝트는 정상적으로 동작하지 않습니다.

|| log.Timestamp.ToString(CultureInfo.CurrentUICulture).Contains(search)

문제가 있는 라인을 제거하고 문제를 해결합니다.

이유는 잘 모르겠습니다만, ToString()은 문자열에 대한 LINQ 표현이지만 엔티티에 대한 표현은 아닌 것 같습니다.LINQ for Entities는 SQL 등의 데이터베이스 쿼리를 처리하며 SQL은 ToString()에 대한 개념이 없습니다.따라서 ToString()을 에 던질 수 없습니다.Where() 절.

그렇다면 첫 번째 줄은 어떻게 작동할까요?에는 ToString() 이 있습니다.CAST ★★★★★★★★★★★★★★★★★」CONVERT지금까지의 추측으로는, 엔티티용 linq는 단순한 경우에 그것을 사용하고 있는 것 같습니다.날짜 시간

의 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.'text'(sqlite로부터의 이행으로 인해) 이 컬럼의 데이터 타입을 지정합니다.: 을 '데이터 유형'으로 하십시오.'nvarchar()'테이블을 재생성합니다.

그러면 Linq가 문자열 비교를 수락합니다.

Telerik Open Access를 폐기하고 Entity Framework 4.0으로 대체하는 작업을 진행 중입니다.텔레릭과 같은 문제가 발생했습니다.GridBoundColumn 필터링이 작동을 중지했습니다.

는 그것이 그,,, 은은, on, 능은 on on에서만 작동하는 것이 아니라는 을 알게 되었습니다.System.String DataTypes그래서 이 실마리를 찾아서 그냥 이걸 이용해서.List()다음과 같이 Linq 쿼리 끝에 표시됩니다.

var x = (from y in  db.Tables
         orderby y.ColumnId descending
         select new
                {
                    y.FileName, 
                    y.FileSource,
                    y.FileType,
                    FileDepartment = "Claims"
                }).ToList();
        

LINQ 쿼리에서 메서드 호출을 사용해야 할 때는 항상 LINQ to Entity 쿼리를 LINQ to Objects 쿼리(예를 들어 ToArray 호출)로 전환하기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/5899683/linq-to-entities-does-not-recognize-the-method-system-string-tostring-method

반응형