C# LINQ to实体中不支持

C# LINQ to实体中不支持,c#,entity-framework,linq,C#,Entity Framework,Linq,每次使用Include扩展名时,当在WHERE子句中使用Include实体的值时,它都会返回一个错误 我包括了System.Data.Entity,这是常见的答案,但仍然存在相同的问题 型号: public partial class business_partner { public int id { get; set; } public string accountid { get; set; } } public partial class order { public int id {

每次使用Include扩展名时,当在WHERE子句中使用Include实体的值时,它都会返回一个错误

我包括了System.Data.Entity,这是常见的答案,但仍然存在相同的问题

型号:

public partial class business_partner
{
public int id { get; set; }
public string accountid { get; set; }
}

public partial class order
{
public int id { get; set; }
public string doc_number { get; set; }
public int vendor_id { get; set; }
public int status { get; set; };

[ForeignKey("vendor_id")]
public virtual business_partner businessPartnerVendor { get; set; }
}

public IQueryable<order> GetOrder()
{
return (context.order);
}
_orderService.GetOrder()
.Include(a => a.businessPartnerVendor)  
.Where(o => o.doc_number == "Order Number"
&& o.businessPartnerVendor.accountid == "TEST"
&& o.status > 2 && o.status != 9).Count() > 0
例外情况:

public partial class business_partner
{
public int id { get; set; }
public string accountid { get; set; }
}

public partial class order
{
public int id { get; set; }
public string doc_number { get; set; }
public int vendor_id { get; set; }
public int status { get; set; };

[ForeignKey("vendor_id")]
public virtual business_partner businessPartnerVendor { get; set; }
}

public IQueryable<order> GetOrder()
{
return (context.order);
}
_orderService.GetOrder()
.Include(a => a.businessPartnerVendor)  
.Where(o => o.doc_number == "Order Number"
&& o.businessPartnerVendor.accountid == "TEST"
&& o.status > 2 && o.status != 9).Count() > 0
LINQ to实体中不支持指定的类型成员“businessPartnerVendor”。仅支持初始值设定项、实体成员和实体导航属性


唉,你忘了写你的要求。您的代码不符合您的要求,因此我可能得出错误的结论,但看看您的代码,您似乎想要以下内容:

告诉我是否有
订单
,即
-具有等于“订单号”的值
DocNumber

-这是
businesspartnervindor
的订单,其值
AccountId
等于“TEST”,
-并且具有大于2且不等于9的值
Status

“告诉我是否有
订单
这一部分”被扣除,因为您只想知道
Count()>0

您的计数将合并所有元素,包括BusinessPartnerVendor的所有列,删除与您的Where不匹配的所有行,并计算剩余的合并项目数。将传输该整数值,然后进程将检查该值是否大于零

数据库查询中较慢的部分之一是将所选数据从数据库管理系统传输到本地进程。因此,限制传输的数据量是明智的

我经常看到人们使用
Include
获取存储在不同表中的项目(通常是一对多)。这将选择完整的行。在businessPartnerVendor中,您只想使用属性
AccountId
。那么为什么选择完整的对象呢

在实体框架中,使用“选择”选择要查询的属性。仅当您要更新获取的数据时才使用Include

由于类中的virtual关键字(可能是一些流畅的API),实体框架知道一对多关系,并将为您执行正确的连接。它将只使用SQL“TAKE 1”来检测是否存在任何元素。只传输一个布尔值

关于实体框架的一些建议

最好的做法是尽可能多地坚持,这样做越多,所需的属性和流畅的API就越少。微软对类、字段、属性、方法等标识符的使用方式与你的做法之间的差异也会更小

在实体框架中,表的所有列都由非虚拟属性表示,虚拟属性表示表之间的关系(一对多、多对多…)

我的建议是:将外键添加到类中,并坚持使用一个标识符来描述表中的一行

因此,决定是否使用
business\u partner
businesspartnervolder
,如果它们实际上是同一类型的东西

添加外键:

// Every Order is the Order of exactly one BusinessPartner, using foreign key (one-to-many)
public int BusinessPartnerId {get; set;}
public virtual BusinessPartner BusinessPartner {get; set;}
这样做的好处是,如果您想选择拥有一个或多个订单的所有业务伙伴的ID,您不必执行加入:

var businessPartnerIds = myDbContext.Orders
    .Where(order => ...)
    .Select(order => order.BusinessPartnerId)
    .Distinct();

只有一个数据库表将被访问

可惜您忘了编写需求。您的代码不符合您的要求,因此我可能得出错误的结论,但看看您的代码,您似乎想要以下内容:

告诉我是否有
订单
,即
-具有等于“订单号”的值
DocNumber

-这是
businesspartnervindor
的订单,其值
AccountId
等于“TEST”,
-并且具有大于2且不等于9的值
Status

“告诉我是否有
订单
这一部分”被扣除,因为您只想知道
Count()>0

您的计数将合并所有元素,包括BusinessPartnerVendor的所有列,删除与您的Where不匹配的所有行,并计算剩余的合并项目数。将传输该整数值,然后进程将检查该值是否大于零

数据库查询中较慢的部分之一是将所选数据从数据库管理系统传输到本地进程。因此,限制传输的数据量是明智的

我经常看到人们使用
Include
获取存储在不同表中的项目(通常是一对多)。这将选择完整的行。在businessPartnerVendor中,您只想使用属性
AccountId
。那么为什么选择完整的对象呢

在实体框架中,使用“选择”选择要查询的属性。仅当您要更新获取的数据时才使用Include

由于类中的virtual关键字(可能是一些流畅的API),实体框架知道一对多关系,并将为您执行正确的连接。它将只使用SQL“TAKE 1”来检测是否存在任何元素。只传输一个布尔值

关于实体框架的一些建议

最好的做法是尽可能多地坚持,这样做越多,所需的属性和流畅的API就越少。微软对类、字段、属性、方法等标识符的使用方式与你的做法之间的差异也会更小

在实体框架中,表的所有列都由非虚拟属性表示,虚拟属性表示表之间的关系(一对多、多对多…)

我的建议是: