当首先提供单个元素时,检查LINQ中的单个元素是否在列表中

时间:2015-12-10 19:49:55

标签: c# linq

我正在使用LINQ to SQL来处理项目中的服务。我涉及三个实体:PCodePurchaseOrder的属性,以及带有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 ... ? );

1 个答案:

答案 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))) ...