【问题标题】:Some values in LINQ Query Statement aren't saved correctly to class with subsonic 3LINQ 查询语句中的某些值未正确保存到 subsonic 3 类
【发布时间】:2017-10-13 07:56:33
【问题描述】:

我正在开发一个使用 Subsonic 3 访问数据库的 MVC 3 应用程序。

我的问题是,我不明白为什么没有将枚举“GlobalType”写入属性。 每次我检查时,值都是 0 而不是“一”。

“Name”属性包含“DateCreated”值。

“DateCreated”属性包含一个新的 DateTime 实例。

据我所知,没有其他领域正在这样做。 ViewItemModel 内部没有逻辑,它只是一个具有属性的类。

如果我在此方法之后手动添加它们,一切正常。 也许有人遇到过与亚音速类似的事情(如果它本身就是亚音速,也许我犯了一个错误)?

我在后端有这个方法:

public IEnumerable<ViewItemModel> LoadView(int registratorId)
{
    var itemModel = from item in _itemQuery
                    join header in _headerQuery on item.HeaderID equals header.ID
                    where header.RegistratorID == registratorId && !(from hidden in _headerHiddenQuery where hidden.ItemID == item.ID && hidden.Type == GlobalType.One && hidden.RegistratorID == registratorId select hidden.ID).Any()

                    orderby item.ID descending

                    select new ViewItemModel()
                    {
                        Type = GlobalType.One,

                        ID = item.ID,
                        Name = header.Name,
                        DateCreated = header.DateCreated,
                        TypeOfTransport = header.TypeOfTransport,
                        TransportType = item.TransportType,

                        Count = (from subItems in _subItemQuery where subItems.ItemID == item.ID select subItems.ID).Count(),

                        // For Status
                        IsArchived = header.IsArchived,
                        IsCanceled = header.IsCanceled,
                        Process = header.Process,
                        End = header.End,
                        IsPublished = header.IsPublished,
                        OpenFrom = header.OpenFrom,
                        OpenTill = header.OpenTill,
                        IsNextStarted = header.IsNextStarted
                    };

    return itemModel.ToList();
}

更新:

GlobalType 枚举如下所示

public enum GlobalType
{
    One = 1,
    Two = 2,
    Individual = 3
}

如果我手动添加它们,我会为此更改返回语句:

var result = itemModel.ToList();

foreach (var item in result)
{
    var headerId = _itemQuery.Where(it => it.ID == item.ID).Select(it => it.HeaderID).FirstOrDefault();
    var created = _itemQuery.Where(it => it.ID == item.ID).Select(it => it.DateCreated).FirstOrDefault();
    var name = _headerQuery.Where(it => it.ID == headerId).Select(it => it.Name).FirstOrDefault();

    item.AnnouncementType = GlobalType.One;
    item.Name = name;
    item.DateCreated = created;
}

return result;

【问题讨论】:

  • 你的 GlobalType 枚举是什么样的?当您手动添加它们时,您到底在做什么?
  • 我用更多信息更新了问题。
  • 可能是延迟执行;在您的手动示例中,尝试删除 foreach,然后检查 return 语句中的 result 变量。
  • 这似乎也描述了您的问题:stackoverflow.com/questions/1302128/subsonic-3-linq-bug
  • 可能是延迟执行。如果我删除 foreach 语句,则结果如问题中所述。属性未设置正确的值。看起来您发布的链接是同样的问题。我要么必须尝试找出亚音速​​的错误,要么必须解决它。也许发表您的评论作为答案,我可以接受吗?

标签: c# linq subsonic3


【解决方案1】:

尝试示例代码:

       public int enum GlobalType
       {
          One = 1,
          Two = 2,
          Individual = 3
        }



   //enum value Convert to int or other data type using casting
   item.AnnouncementType = (int) GlobalType.One;

    //Suppose if condition using 
    if((GlobalType)item.AnnouncementType==GlobalType.One)
    {
       //your code
    }

【讨论】:

  • 问题出在 linq select 语句中。在 itemModel.ToList() 之后更改的所有内容 - 这是执行查询的时间 - 将被正确保存。将 select 语句中的 Enum 转换为 int 并返回仍会导致 Enum 将其值显示为 0。-您的示例代码本身(没有亚音速查询)将运行良好。
【解决方案2】:

感谢DaveParsons 的评论,我设法创建了一个解决方法。

在这种情况下,代码将不得不遍历找到的元素列表两次,但不会将整个表加载到内存中。 由于创建包含多个类的匿名对象存在错误(引发异常),如下所示:

select new { item, header, subItems }

通过手动分配我需要的数据,我设法获得了所有需要的数据:

public IEnumerable<ViewItemModel> LoadView(int registratorId)
{
    var itemModel = from item in _itemQuery
                    join header in _headerQuery on item.AnnouncementHeaderID equals header.ID
                    where header.RegistratorID == registratorId && !(from hidden in _headerHiddenQuery where hidden.ItemID == item.ID && hidden.Type == GlobalType.One && hidden.RegistratorID == registratorId select hidden.ID).Any()

                    orderby item.ID descending

                    select new {
                        Type = GlobalType.One,

                        ID = item.ID,
                        Name = header.Name,
                        DateCreated = header.DateCreated,
                        TypeOfTransport = header.TypeOfTransport,
                        TransportType = item.TransportType,

                        Count = (from subItems in _subItemQuery where subItems.ItemID == item.ID select subItems.ID).Count(),

                        // For Status
                        IsArchived = header.IsArchived,
                        IsCanceled = header.IsCanceled,
                        Process = header.Process,
                        End = header.End,
                        IsPublished = header.IsPublished,
                        OpenFrom = header.OpenFrom,
                        OpenTill = header.OpenTill,
                        IsNextStarted = header.IsNextStarted
                    };

    return itemModel
            .ToList()
            .Select(it => new ViewItemModel() {

                Type = it.Type,

                ID = it.ID,
                Name = it.Name,
                DateCreated = it.DateCreated,
                TypeOfTransport = it.TypeOfTransport,
                TransportType = it.TransportType,

                Count = it.Count,

                // For Status
                IsArchived = it.IsArchived,
                IsCanceled = it.IsCanceled,
                Process = it.Process,
                End = it.End,
                IsPublished = it.IsPublished,
                OpenFrom = it.OpenFrom,
                OpenTill = it.OpenTill,
                IsNextStarted = it.IsNextStarted

            })
            .ToList();
}

注意:查询的返回值是一个匿名对象,声明了每个必要的字段。

在数据库返回与数据库(模型)中同名的所有字段后,我们必须使用“.ToList()”或类似的东西强制执行(延迟执行?)。

由于数据现在在内存中,我们可以将匿名对象中的值分配给用于此目的的原始类。

我确信有一种更可靠的方法使用反射,但这是我想出的。

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    相关资源
    最近更新 更多