2017-04-19 32 views
1

在MVC项目我的工作,我有一个剑道DROPDOWNLIST调用我的服务器采取行动,执行任何读操作(incluse过滤):System.Linq.Expressions与计算列

ServiceRequestAssociabili([DataSourceRequest] DataSourceRequest request, int? idServiceRequestOriginale) 

小部件是绑定到2个属性: IdServiceRequest(值)和IdServiceRequestDescrizione(文本)。

IdServiceRequest是实体ID和IdServiceRequestDescrizione是计算列至极我已经在部分类的实体

public string IdServiceRequestDescrizione 
     { 
      get 
      { 
       if (TipologiaChiamata.IdTipologiaChiamata != (int)Enums.TipologiaChiamata.Automatica) 
       { 
        return IdServiceRequest + " " + Note; 
       } 
       else 
       { 
        return IdServiceRequest + " " + Email.EmailOggetto; 
       } 
      } 
     } 

定义为了创建正确的LINQ查询来执行我创建了一个系统的过滤器。 Linq.Expression我的实体转化为含2个属性DTO:

Expression<Func<ServiceRequest, DTO>> funcError = s => new DTO 
      { 
       IdServiceRequest = s.IdServiceRequest, 
       IdServiceRequestDescrizione = s.IdServiceRequestDescrizione 
      }; 

然后我用这句话来项目我的IQueryable:

var srq = _serviceRequestRepository.GetByParametersAsQueryable(idServiceRequestOriginale: idServiceRequestOriginale, senzaTicketAssociato: true).Select(funcError).ToList();    

当我兑现与ToList查询()出现以下错误: enter image description here

如果我,而不是在部分限定IdServiceRequestDescrizione我定义它的System.Linq.Expression不会引发错误和里面的一切工作正常。

Expression<Func<ServiceRequest, DTO>> func = s => new DTO 
      { 
       IdServiceRequest = s.IdServiceRequest, 
       IdServiceRequestDescrizione = s.TipologiaChiamata.IdTipologiaChiamata != (int)EntityModel.Enums.TipologiaChiamata.Automatica ? s.IdServiceRequest + " " + s.Note : s.IdServiceRequest + " " + s.Email.EmailOggetto 
      }; 

有人能给我这种行为的专业解释吗?为什么我不能在linq Expression中引用自定义属性?

回答

2

计算列是用C#实现的,但EF只对数据库模型进行操作(转换为/从SQL)。如果颠倒顺序的方法调用

.ToList().Select(funcError); 

即记录首先翻译成C#实体对象,然后计算列都可以访问

您的代码应该工作。 (我通常使用NHibernate的,但问题是相同的)

+0

是不是LINQ。用c#实现的表达式呢?在我的场景中,我无法实现该指令中的实体,因为额外的过滤器应用于Iqueryable对象。要清楚:在投影到DTO之后必须使用ToList()。 –

+0

这个问题基本上是一样的问题:** http://stackoverflow.com/questions/14726285/custom-properties-and-lambda-expressions** –

1

有一些选择:

1)Linq.Tranlations Linq.Tranlations

,让你写这样的事情:

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    private static readonly CompiledExpression<Customer, string> fullNameExpression 
    = DefaultTranslationOf<Customer>.Property(e => e.FullName).Is(e => e.FirstName + " " + e.LastName); 

    [NotMapped] 
    public string FullName 
    { 
    get { return fullNameExpression.Evaluate(this); } 
    } 
} 

var customers = ctx.Customers 
    .Select(c => new 
    { 
    FullName = c.FullName 
    }) 
    .WithTranslations(); 

2)DelegateDecompiler DelegateDecompiler

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [NotMapped] 
    [Computed] 
    public string FullName 
    { 
    get { return FirstName + " " + LastName; } 
    } 
} 
var customers = ctx.Customers 
    .Select(c => new 
    { 
    FullName = c.FullName 
    }) 
    .Decompile();