이 예외가 발생합니다.
지정된 형식 멤버 ‘유료’는 LINQ to Entities에서 지원되지 않습니다. 이니셜 라이저, 엔터티 멤버 및 엔터티 탐색 속성 만 지원됩니다.
public ActionResult Index()
{
var debts = storeDB.Orders
.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
return View(debts);
}
내 모델 클래스
public partial class Order
{
public bool Paid {
get {
return TotalPaid >= Total;
}
}
public decimal TotalPaid {
get {
return Payments.Sum(p => p.Amount);
}
}
결제는 금액 필드를 포함하는 관련 테이블입니다. 결제에 대한 올바른 정보를 보여주는 Where 절을 제거하면 쿼리가 작동합니다. 코드에 어떤 문제가 있는지 단서가 있습니까?
다음과 같이 제안 된 답변처럼 해결되었습니다.
public ActionResult Index()
{
var debts = storeDB.Orders
.OrderByDescending(o => o.DateCreated)
.ToList()
.Where(o => o.Paid == false);
return View(debts);
}
답변
엔터티가 유료 속성을 SQL로 변환하려고하는데 테이블 스키마의 일부가 아니기 때문에 할 수 없습니다.
할 수있는 일은 Entity가 유료 필터가없는 테이블을 쿼리 한 다음 유료 필터를 필터링하도록하는 것입니다.
public ActionResult Index()
{
var debts = storeDB.Orders
//.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
debts = debts.Where(o => o.Paid == false);
return View(debts);
}
물론 이는 모든 데이터를 웹 서버로 다시 가져 와서 데이터를 필터링한다는 것을 의미합니다. DB 서버에서 필터링하려는 경우 테이블에 계산 된 열을 생성하거나 저장 프로 시저를 사용할 수 있습니다.
답변
비슷한 문제를 해결해야했습니다. 위의 솔루션에는 메모리 내 처리가 필요하며 이는 나쁜 습관입니다 (지연로드).
내 해결책은 술어를 반환하는 도우미를 작성하는 것이 었습니다.
public static class Extensions
{
public static Expression<Func<Order, bool>> IsPaid()
{
return order => order.Payments.Sum(p => p.Amount) >= order.Total;
}
}
linq 문을 다음과 같이 다시 작성할 수 있습니다.
var debts = storeDB.Orders
.Where(Extensions.IsPaid())
.OrderByDescending(o => o.DateCreated);
이것은 계산 로직 (DRY)을 재사용하고자 할 때 편리합니다. 단점은 논리가 도메인 모델에 없다는 것입니다.
답변
이 문제는 또한 [NotMapped]
DB 모델과 뷰 모델에서 이름이 같은 속성 .
AutoMapper는 프로젝션 중에 DB에서 선택하려고합니다. 그리고 NotMapped 속성은 분명히 DB에 존재하지 않습니다.
해결책은 Ignore
DB 모델에서 뷰 모델로 매핑 할 때 AutoMapper 구성의 속성에 있습니다.
[NotMapped]
이름이 있는 속성 찾기Foo
DB 모델에서 .- 같은 이름의 속성을 찾으십시오.
Foo
보기 모델에서 . - 이 경우 AutoMapper 구성을 변경하십시오. 더하다
.ForMember(a => a.Foo, b => b.Ignore());
답변
Linq는 문을 SQL 문으로 변환하고 데이터베이스에서 실행합니다.
이제이 변환은 엔터티 멤버, 이니셜 라이저 및 엔터티 탐색 속성에 대해서만 발생합니다. 따라서 기능을 달성하거나 속성 비교를 얻으려면 먼저 메모리 내 목록으로 변환 한 다음 데이터를 검색하는 기능을 적용해야합니다.
따라서 전체적으로
var debts = storeDB.Orders.toList()
.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
답변
다른 가능한 이유는 IEnumerable
귀하의 자산에 하고 입니다.ICollection
그래서 대신 :
public class This
{
public long Id { get; set; }
//...
public virtual IEnumerable<That> Thats { get; set; }
}
이 작업을 수행:
public class This
{
public long Id { get; set; }
//...
public virtual ICollection<That> Thats { get; set; }
}
그리고 당신은 늠름한 도리 … 2 시간을 잃는 것은 어리석은 일입니다.
답변
이 상황은 unsigned int와 같이 EntityFramework 유형 에서 지원하지 않는 유형을 사용하는 경우에도 발생할 수 있습니다 .
이것은 그러한 오류의 경우였습니다.
지원되는 유형에 대한 추가 정보 확인 :
https://msdn.microsoft.com/en-us/library/ee382832(v=vs.100).aspx
GFoley83 : Entity Framework에서 unsigned int / long 유형을 사용하는 방법에 설명 된 이러한 상황에 대한 몇 가지 해결
방법이 있습니다.
답변
get
without set
속성 만있는 멤버 변수가 있기 때문에이 문제에 직면 했습니다.
그 자신의 수단 auto calculated
및 not stored
열의로서the table
따라서 그 not exist
안에table schema
따라서 a 및 속성 에 대한
make sure
모든 멤버 변수not auto calculated
have
getter
setter