无法在 LINQ 选择期间设置枚举属性

本文关键字:设置 枚举 属性 选择 LINQ | 更新日期: 2023-09-27 18:35:17

>我有以下代码片段

IQueryable<RssItem> rssItems = from prodotti prodotto in tuttiProdotti
                                               join marca in tutteMarche on prodotto.marca equals marca.id
                                               where prodotto.eliminato == 0
                                               orderby prodotto.id ascending
                                               select new GoogleShoppingRssItem
                                               {
                                                   Author = AUTHOR,
                                                   //Availability = prodotto.disponibilita > 0 ? AvailabilityType.instock : AvailabilityType.outofstock,
                                                   //Availability = AvailabilityType.instock,
                                                   Title = prodotto.titolo,
                                               };

当可用性行的第一个版本未注释时,我得到了ArgumentException,说value不属于Edm.Int32类型。我认为这与prodotto.disponibilita属性有关,该属性int?(但数据库中不存在null值)。第二个版本不检查产品数量,会引发相同的异常。

只有在注释了可用性设置的第二个版本之后,代码才最终起作用并评估了表达式。

枚举定义如下:

  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
    [System.SerializableAttribute()]
    [XmlType(Namespace="http://base.google.com/ns/1.0")]
    [XmlRoot("availability", Namespace="http://base.google.com/ns/1.0", IsNullable=false)]
    public enum AvailabilityType {
        /// <remarks/>
        [XmlEnum("in stock")]
        instock,
        /// <remarks/>
        [XmlEnum("available for order")]
        availablefororder,
        /// <remarks/>
        [XmlEnum("out of stock")]
        outofstock,
        /// <remarks/>
        preorder,
    }

在 LINQ select 语句中设置 enum 属性时,我应该了解些什么吗?

无法在 LINQ 选择期间设置枚举属性

关于在 LINQ select 语句中设置枚举属性,我应该了解什么吗?

是的。EF4 不支持枚举,不能在 Linq 到实体查询中使用枚举。如果在 Linq-to-Objects 查询中使用它们,它应该可以工作,因此请尝试以下操作:

IQueryable<RssItem> rssItems = (from prodotto in tuttiProdotti
                                join marca in tutteMarche on prodotto.marca equals marca.id
                                where prodotto.eliminato == 0
                                orderby prodotto.id ascending
                                select prodotto).ToList() // Now you switched to L2O
                               .Select(x => new GoogleShoppingRssItem
                                               {
                                                   Author = AUTHOR,
                                                   Availability = x.disponibilita > 0 ? AvailabilityType.instock : AvailabilityType.outofstock,
                                                   Title = x.titolo,
                                               });