我正在使用LINQ to SQL来处理项目中的服务。我涉及三个实体:PCode
是PurchaseOrder
的属性,以及带有User
的M:N.
PCode (M:N) User
PCode (1:M) PurchaseOrder
该服务适用于PurchaseOrder
,因此正在查询该表。因此,使用.Where()
时需要p => p.PCode
才能使用该值。我知道.Contains()
和其他类似的命令,但它们都要求列表首先出现,我不能用这种类型的查询来做。我最终需要检查特定PCodeId
中的PurchaseOrder
是否在与当前用户关联的PCodeId
列表中。如何在LINQ to SQL中以这种方式过滤?我觉得这很简单,我只是想不出来。
简化User
类:
public partial class User
{
public virtual int Id { get; set; }
public virtual ICollection<PCode> PCodes { get; set; }
}
PCode
:
public partial class PCode
{
public virtual int Id { get; set; }
public virtual ICollection<User> Users { get; set; }
}
PurchaseOrder
:
public partial class PurchaseOrder
{
public virtual int Id { get; set; }
public virtual int PCodeId { get; set; }
}
查询开始:
// list to be searched can either be passed into the function
// or retrieved via navigation property when the query runs, either works
var query = _poRepository.Table;
if (condition)
// query = query.Where( ? );
// query = query.Where(p => p.PCode ... ? );
答案 0 :(得分:1)
var CurrentUser=db.Users
.Include(u=>u.PCodes)
.Where(u=>u.id==something);
if (CurrentUser.PCodes.Any(pc=>...))
您还缺少采购订单和PCode上的导航属性:
public partial class PurchaseOrder
{
public int Id { get; set; } // Should not be virtual
public int PCodeId { get; set; } // Should not be virtual
public virtual PCode PCode { get; set; } // new Navigation
}
public partial class PCode
{
public int Id { get; set; } // Should not be virtual
public virtual ICollection<User> Users { get; set; }
public virtual ICollection<PurchaseOrders> PurchaseOrders { get; set; } // new Navigation
}
反之亦然:
var po=db.PurchaseOrders
.Include(po=>po.PCode)
.Include(po=>po.PCode.Users)
.First(po=>po.id==someid);
if (po.PCode.Users.Contains(currentUser)) ...
or
if (po.PCode.Users.Any(u=>u.id==someuserid)) ...
或者如果你拥有的只是一个用户ID和poid:
if (db.PurchaseOrders.Any(po=>po.id==poid && po.PCode.Users.Any(u=>u.id==userid))) ...