EnumerateFiles in Linq

本文关键字:Linq in EnumerateFiles | 更新日期: 2023-09-27 18:28:38

我有LINQ to Entities does not recognize the method 'System.Collections.Generic.IEnumerable 1[System.String]EnumerateFiles(System.String)'方法,此方法无法转换为存储表达式。`错误我需要从文件夹中获取图像链接,我从数据库中获取ID。

        // Collect flat items and add in List<>
        var nearestItems = from item in _db.Flats
                           select new listItem()
                           {
                               Price = item.Price,
                               Address = item.Address,
                               Bathroom = item.Bathroom,
                               BesprovodnoiInternet = item.BesprovodnoiInternet,
                               City = item.City,
                               FloorAll = item.FloorAll,
                               FloorCurrent = item.FloorCurrent,
                               Funiture = item.Funiture,
                               Kondicioner = item.Kondicioner,
                               PartyFree = item.PartyFree,
                               RoomQuantity = item.RoomQuantity,
                               TipArendy = item.TipArendy,
                               TV = item.TV,
                               ImagesString = Directory.EnumerateFiles(Server.MapPath("~/Content/Prop/" + item.FlatID + "/"))
                                               .Select(fn => "~/Content/Prop/" + item.FlatID + "/" + Path.GetFileName(fn)).ToList()
                           };

是否有此代码或备用代码的修复程序?

EnumerateFiles in Linq

您的LINQ查询应该转换为SQL查询,以便在SQL Server上运行。很明显,该引擎无法将Directory.EnumerateFiles转换为SQL查询。您可以将新属性FlatId添加到listItem中,然后尝试以下操作:

// Collect flat items and add in List<>
var nearestItems = (from item in _db.Flats
                       select new listItem()
                       {
                           Price = item.Price,
                           Address = item.Address,
                           Bathroom = item.Bathroom,
                           BesprovodnoiInternet = item.BesprovodnoiInternet,
                           City = item.City,
                           FloorAll = item.FloorAll,
                           FloorCurrent = item.FloorCurrent,
                           Funiture = item.Funiture,
                           Kondicioner = item.Kondicioner,
                           PartyFree = item.PartyFree,
                           RoomQuantity = item.RoomQuantity,
                           TipArendy = item.TipArendy,
                           TV = item.TV,
                           FlatId = item.FlatID,
                       }).ToList();
foreach(var item in nearestItems)
{
    item.ImagesString = Directory.EnumerateFiles(Server.MapPath("~/Content/Prop/" + item.FlatId + "/"))
     .Select(fn => "~/Content/Prop/" + item.FlatId + "/" + Path.GetFileName(fn)).ToList();
}

EntityFramework将基于LINQ构建查询,该查询将在数据库中执行。因此,在使用LINQ to Entity时存在一些常量。EF必须如何将此代码转换为数据库查询?Directory.EnumerateFiles

没有办法

因此,您必须只选择所需的属性,然后在.net:中按您的意愿进行更改

var nearestItems = (from item in _db.Flats
                       select new listItem()
                       {
                           Price = item.Price,
                           Address = item.Address,
                           Bathroom = item.Bathroom,
                           BesprovodnoiInternet = item.BesprovodnoiInternet,
                           City = item.City,
                           FloorAll = item.FloorAll,
                           FloorCurrent = item.FloorCurrent,
                           Funiture = item.Funiture,
                           Kondicioner = item.Kondicioner,
                           PartyFree = item.PartyFree,
                           RoomQuantity = item.RoomQuantity,
                           TipArendy = item.TipArendy,
                           TV = item.TV,
                           FlatId = item.FlatID,
                       }).ToList();

在您的类中,更改属性ImagesString:的get访问器

public List<string> ImagesString
{
    get 
    {
        return Directory.EnumerateFiles(Server.MapPath("~/Content/Prop/" + FlatID + "/"))
                        .Select(fn => "~/Content/Prop/" + FlatID + "/" + Path.GetFileName(fn))
                        .ToList();
    }
}