当我在查询中调用另一个存储库时,此方法无法转换为存储表达式

本文关键字:存储 此方法 表达式 转换 查询 另一个 调用 | 更新日期: 2023-09-27 18:19:28

我正在尝试执行这样的查询:

  List<UserAssitanceView> AllAssitance = objFirstIdeaAssistanceRepository.GetAll().Select(i => new UserAssitanceView()
    {
        assitanceId = i.Assistance.Id.ToString(),
        assitanceInternalTell = i.Assistance.AssistanceTell,
        assitanceName = i.Assistance.AssistanceName,
        experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name,
        expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family,
        ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile
    }).ToList();
public class UserAssitanceView
    {
        public string assitanceId { set; get; }
        public string assitanceName { set; get; }
        public string experteName { set; get; }
        public string expertFamily { set; get; }
        public string assitanceInternalTell { set; get; }
        public string ExperteMobile { set; get; }

    }

FirstIdeaAssistance类别:

namespace DomainClass
{
    using System;
    using System.Collections.Generic;
    public partial class FirstIdeaAssistance
    {
        public int Id { get; set; }
        public string Date { get; set; }
        public long FirstIdeaId { get; set; }
        public int AssistanceId { get; set; }
        public virtual FirstIdea FirstIdea { get; set; }
        public virtual Assistance Assistance { get; set; }
    }
}

在我的查询中,我调用了另一个名为objAssistanceRepository.ReturnExpertOfAssitance的存储库方法,函数如下:

public class AssistanceRepository : GenericRepository<InModelContainer, Assistance>
{
    public User ReturnExpertOfAssitance(int assitanceId)
    {
        return
            FindBy(i => i.Id == assitanceId && i.AssistanceJurors.Any(j => j.User.Permission == "Assistance"))
                .First().AssistanceJurors.Select(i => i.User).First();
    }
}

执行后,我得到了这个错误:

LINQ to Entities does not recognize the method 'DomainClass.User ReturnExpertOfAssitance(Int32)' method, and this method cannot be translated into a store expression.

当我从代码中删除这3行时,它运行良好:

experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name,
            expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family,
            ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile

我以前也这样做过,效果很好,但现在我不知道为什么会出现这个错误。

每一个想法都会被认可

向致以最良好的问候

当我在查询中调用另一个存储库时,此方法无法转换为存储表达式

Linq无法识别该方法。它只能从表达式树和一些SQL函数扩展中转换。

您需要首先执行查询。

List<UserAssitanceView> AllAssitance = objFirstIdeaAssistanceRepository.GetAll().Select(i => new UserAssitanceView()
    {
        assitanceId = i.Assistance.Id.ToString(),
        assitanceInternalTell = i.Assistance.AssistanceTell,
        assitanceName = i.Assistance.AssistanceName,
    })
   .ToList();

然后稍后设置一些属性。

foreach (var item in AllAssitance)
{
    item.experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name;
    item.expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family;
    item.ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile;
}

或者,您可以先对整个查询执行它。

List<UserAssitanceView> AllAssitance = 
     objFirstIdeaAssistanceRepository.GetAll().AsEnumerable().Select
                                                  ^^^^
                                                add this

PS

AsEnumerable将类型从IQueryable<T>更改为IEnumerable<T>,并且只有在迭代时才会导致不同的执行。这将确保此调用之后的任何执行都不会执行数据库,而是简单地从枚举值迭代。所以现在可以安全地使用非linq表达式,比如CLR方法。

此代码仅不会执行查询。

var result = objFirstIdeaAssistanceRepository.GetAll().AsEnumerable();

但是在它之后添加Select方法,将执行查询。

var result = objFirstIdeaAssistanceRepository.GetAll().AsEnumerable().Select(/* */);