无法转换LINQ表达式,请以可以转换的形式重写查询

e37o9pze  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(98)

我试图编写一个LINQ查询,以根据某些连接获取结果,但我不确定如何正确编写它
这是我的课

public class Result
    {
        public Response Response { get; set; }
        public IEnumerable<Item> Items { get; set; }

    } 

public class Response
    {
        public TableA TableA { get; set; }
        //other properties
    }

public class TableA
    {
        public IEnumerable<ItemA> ListA { get; set; }
        //other properties
    }

我正在尝试编写LINQ查询

var query = from tableA in _context.Set<TableA>().Where(t => t.Id == id).Include(t => t.ListA)
            //some joins with other tables
            // ....
            from itemA in tableA.ListA
            join itemB in _context.Set<TableB>() on itemA.Id equals itemB.Id into items
                                                                           
            select new Result
            {
               Response = new Response
               {
                    TableA = tableA,
                    //other properties from different joins                                                              
               },
               Items = items.AsEnumerable()                                                               

            };

上一个查询返回以下错误
无法转换。请以可以转换的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端计算。
当我尝试将前一个查询划分为两个查询时,它按预期工作

var query1 = from tableA in _context.Set<TableA>().Where(t => t.Id == id).Include(t => t.ListA)
             //some joins with other tables
             // ....                                                               
             select new Result
             {
               Response = new Response
               {
                    TableA = tableA,
                    //other properties from different joins                                                              
               },
             };   
                                                                           
                                                                           
var query2 = from itemA in query1.FirstOrDefault().Response.TableA.ListA
             join itemB in _context.Set<TableB>() on itemA.Id equals itemB.Id into items
             from item in items.DefaultIfEmpty()
             select item;

var result = new Result()
                {
                    Response = query1.FirstOrDefault().Response,
                    Items = query2
                };

我想知道第一个查询有什么问题,如果可能的话,如何在不将其分成两个查询的情况下编写它?
先谢了

ejk8hzay

ejk8hzay1#

我认为错误来自from itemA in tableA.ListA这一部分。我不知道如何将其转换为SQL。
我理解的原因是,您希望检索tableA行及其itemA和itemB。一种解决方案是从如下子查询中检索itemB:

var query =
    from tableA in _context.Set<TableA>().Include(t => t.ListA)
    where tableA.Id == id
    select new Result {
        Response = new Response {
            TableA = tableA,
        },
        Items = (from itemA in tableA.ListA
                    join itemB in _context.Set<ItemB>()
                    on itemA.Id equals itemB.Id
                select itemB).AsEnumerable()
    };

生成的SQL:

SELECT [t].[Id], [t].[Name], [i].[Id], [i].[Name], [i].[TableAId], [t0].[Id], [t0].[Name], [t0].[Id0]
FROM [TableAs] AS [t]
LEFT JOIN [ItemAs] AS [i] ON [t].[Id] = [i].[TableAId]
LEFT JOIN (
    SELECT [i1].[Id], [i1].[Name], [i0].[Id] AS [Id0], [i0].[TableAId]
    FROM [ItemAs] AS [i0]
    INNER JOIN [ItemBs] AS [i1] ON [i0].[Id] = [i1].[Id]
) AS [t0] ON [t].[Id] = [t0].[TableAId]
WHERE [t].[Id] = @__id_0
ORDER BY [t].[Id], [i].[Id], [t0].[Id0]

相关问题