2017-03-02 43 views
0

三个表:3表LINQ联结,加上的foreach

地理数据: ID

地址: ID,GeoDataID,用户名

产品: ID,用户名

GeoDat之间存在一对一的关系a.ID和Address.GeoDataID以及Address.UserID和Products之间的一对多关系。用户ID

我有一个GeoData ID数组作为输入,我想获取所有相关产品。

如果我只有一个地理数据ID我会尝试这样的:

int geoDataID = 3456; 
     using (var context = new BaseContext()) 
     { 
      from p in context.Products 
      join a in context.Addresses on p.UserID equals a.UserID 
      join g in context.GeoData on a.GeoDataID equals g.ID 
      where g.ID == geoDataID 
      select new { p }; 
     } 

但我有一个数组(INT []地理数据)作为输入我不能设法把它在一起。

+1

如果'geoDataID'是'INT []','然后在那里geoDataID.contains(g.ID)' –

+0

我很抱歉,我不明白您的评论:这是应该是一个解决方法,以获取预期的结果? – Luke

+0

它不清楚你的问题,但如果'geoDataID'说'int [] geoDataID = new int [] {1,2,3}',那么用我的第一条评论中的代码替换'where g.ID == geoDataID' –

回答

1

试试这个:

using (var context = new BaseContext()) 
     { 
     var results = from p in context.Products 
      join a in context.Addresses on p.UserID equals a.UserID 
      where geoData.Contains(a.geoDataID) 
      select p; 
     } 
+0

谢谢,这可以用作intendend。还有 “where geoDataID.Any(item => item == a.GeoDataID)”。 是否有任何理由更喜欢'包含'到'任何'方法? – Luke

1

所有你需要做的是使用在地理数据ID的集合Contains()方法来筛选所需的记录。

public IEnumerable<Product> GetProductsByGeoData(IEnumerable<int> geoDataIds) 
{ 
    var products = context.GeoData 
     .Where(gd => geoDataIds.Contains(gd.Id)) 
     .Join(context.Addresses, 
      gd => gd.Id, 
      a => a.GeoDataId, 
      (gd, a) => a) 
     .Join(context.Products, 
      a => a.UserId, 
      p => p.UserId, 
      (a, p) => p); 
    return products; 

} 
+0

我有一个int数组作为输入。你的建议需要一个Ienumerable (或可能是Ienumerable )。我不知道如何将我的实际输入转换为所需的可枚举。 – Luke

+1

@Luke,一个int数组(int []')**是** IEnumerable '。 – RePierre