linq - 如何在类关联到第二类时,将LINQ表达式用作查询类的static 成员

  显示原文与译文双语对照的内容
0 0

这与我以前的问题相关: 在. NET MVC 4模型中合并字段,而无需从 LINQ from获得"只支持初始值设定项,实体成员和实体导航属性"

在我的模型中添加了一个 static 表达式后,当从该模型类中选择可以枚举时,可以使用of语句。 现在我必须尝试使用相关模型中的表达式,我再次超越了LINQ和EF的知识。

所涉及的简化模型包括:


//The model class for Items for sale in the system
public class Item
{
 [Key, Column(Order = 0)]
 public String CompanyId { get; set; }

 [Key, Column(Order = 1)]
 public String ItemId { get; set; }

 public Int32 CategoryId { get; set; }

 [ForeignKey("CategoryId")]
 public virtual GlobalCategory GlobalCategory { get; set; }

 [ForeignKey("CompanyId, CategoryId")]
 public virtual CompanyCategory CompanyCategory { get; set; }

//LINQ Expression to coalesce a company specific category alias
//with the default global category when no alias exists
 public static Expression<Func<Item, String>> linqCategoryName
 {
 get
 {
 return i => (i.CompanyCategory.CategoryAlias == null || 
 i.CompanyCategory.CategoryAlias =="")?
 i.GlobalCategory.CategoryName :
 i.CompanyCategory.CategoryAlias;
 }
 }
}


//The model class for Item Relationships, used to relate two items 
//(a"Parent Item" and"Related Item") such as one is a supply for to the other
public class ItemRelationship
{
 [Key]
 public Int32 RelationshipId { get; set; }

 public Int32 RelationshipTypeId { get; set; }

 [ForeignKey("RelationshipTypeId")]
 public virtual RelationshipType RelationshipType { get; set; }

 public String CompanyId{ get; set; }

 public String ItemId{ get; set; }

 [ForeignKey("CompanyId, ItemId")]
 public virtual Item ParentItem { get; set; }

 public String RelatedCompanyId{ get; set; }

 public String RelatedItemId{ get; set; }

 [ForeignKey("RelatedCompanyId, RelatedItemId")]
 public virtual Item RelatedItem { get; set; }
}

可以使用此类LINQ语句成功地使用Item类的LINQ表达式成员:


var categories = usscodb.Items.Where(i => i.CompanyId = siteCompanyId)
. OrderBy(Item.linqCategoryName)
. Select(Item.linqCategoryName)
. Distinct();

但是,我不确定如何在这样的情况下使用 static Item.linqCategoryName:


var categories = db.ItemRelationships
. Where(ir => ir.RelationshipType.RelationshipTypeName =="Supply"
 && ir.ParentItem.Active
 && ir.RelatedItem.Active
 && ir.ParentItem.CompanyId == siteCompanyId
 && ir.RelatedItem.CompanyId == siteCompanyId)

//the linqCategoryName member is not available for use this way
. Select(ir.ParentItem.linqCategoryName)
. Distinct();

我想我在这里。 我试图使用项的父密钥显式联接项关系,然后尝试使用 static LINQ表达式。 不知道如何显式地告诉LINQ要使用 static 方法的项。

时间: 原作者:

0 0

尝试这个:


.Select(ir => ir.ParentItem)
.Select(Item.linqCategoryName)

...