2013-04-25 34 views
2

我有了一個屬性供應商ID和其他屬性NearestLocation這是一種SupplierLocation的類型供應商屬性的最小值時,SupplierLocation由性供應商ID和DistanceFromDevice選擇和基於子更新對象使用LINQ

class Supplier 
{ 
    public int SupplierId { get; set; } 
    public SupplierLocation NearestLocation { get; set; } 
} 

class SupplierLocation 
{ 
    public int SupplierId { get; set; } 
    public decimal DistanceFromDevice { get; set; } 
    public double Longitude { get; set; } 
    public double Latitude {get; set;} 
} 

我有一個供應商可以有多個位置的我所有供應商的列表。我還計算了每個位置的DistanceFromDevice屬性。 我有一個列表,其ID可以在SupplierLocations列表中找到。

我想要使用linq的方法是將我的供應商加入到SupplierId的SupplierLocation中,並填入供應商類的NearestLocation屬性,該位置的DistanceFromDevice值爲該特定供應商的所有位置的最小值。

希望這是有道理的。這可以使用linq完成。

非常感謝提前。 保羅

+0

爲什麼你特別想使用LINQ嗎?除非我誤解了你的問題,否則你是否可以遍歷你的'SupplierLocation'列表,查找匹配的'SupplierId'並跟蹤最低的'DistanceFromDevice'。保持符合ID和當前最小值的運行列表「供應商」,並在最後使用第一個(如果這符合您的業務邏輯)或拋出異常,如果不應超過1個。 – Thelonias 2013-04-25 19:29:09

回答

1

這裏是LINQPad

工作示例
void Main() 
{ 
    var suppliers = new List<Supplier> 
    { 
     new Supplier() {SupplierId = 1}, 
     new Supplier() {SupplierId = 2}, 
     new Supplier() {SupplierId = 5} 
    };  

    var locations = new List<SupplierLocation> 
    { 
     new SupplierLocation {SupplierId = 1, DistanceFromDevice = 10, Latitude = 1, Longitude = 2}, 
     new SupplierLocation {SupplierId = 1, DistanceFromDevice = 20, Latitude = 1, Longitude = 3}, 
     new SupplierLocation {SupplierId = 1, DistanceFromDevice = 30, Latitude = 1, Longitude = 4}, 
     new SupplierLocation {SupplierId = 1, DistanceFromDevice = 40, Latitude = 1, Longitude = 5}, 
     new SupplierLocation {SupplierId = 2, DistanceFromDevice = 10, Latitude = 2, Longitude = 2}, 
     new SupplierLocation {SupplierId = 2, DistanceFromDevice = 20, Latitude = 2, Longitude = 3}, 
     new SupplierLocation {SupplierId = 3, DistanceFromDevice = 10, Latitude = 3, Longitude = 2} 
    }; 

    var result = from s in suppliers 
     join l in locations on s.SupplierId equals l.SupplierId 
     into grp 
     where grp.Count() > 0 
     select new Supplier() { SupplierId = s.SupplierId, NearestLocation = grp.OrderBy (g => g.DistanceFromDevice).First()}; 

    result.Dump(); 
} 

class Supplier 
{ 
    public int SupplierId { get; set; } 
    public SupplierLocation NearestLocation{ get; set; } 
} 

class SupplierLocation 
{ 
    public int SupplierId { get ;set; } 
    public decimal DistanceFromDevice { get; set; } 
    public double Longitude { get; set; } 
    public double Latitude {get; set;} 
} 
+0

感謝Vlad這樣做訣竅 - 感謝您的時間。儘管一件小事 - 如果我沒有一個特定供應商的任何位置Id - 我得到一個InvalidOperationException:序列不包含任何元素, - 我會嘗試先將所有這些供應商從供應商列表中刪除,然後再進行連接 - 我猜 - 除非有更好的方法來處理這個 – Paul 2013-04-26 07:28:38

+0

@Paul,我更新了我的代碼以處理您沒有任何特定供應商的任何位置的情況。請看一下。 – 2013-04-26 12:27:18

+0

非常感謝,這與現在的計數完美結合 – Paul 2013-04-26 14:12:58

1

所以,你要設置NearestLocationSupplier其中SupplierId等於一個在List<SupplierLocation>

假設你有一個List<SupplierLocation>名爲「位置」和「currentSupplier」是你要分配的NearestLocation的Supplier

try 
{ 

    var minForSupplier = Locations.Where(x => x.SupplierId == currentSupplier.SupplierId).Min(x => x.DistanceFromDevice); 

    currentSupplier.NearestLocation = Locations.Where(x => x.SupplierId == currentSupplier.SupplierId && x.DistanceFromDevice == minForSupplier).Single(); 
} 
catch(InvalidOperationException e) 
{ 
    // There is more than one SupplierLocation 
} 
+0

謝謝對於這一點瑞安 - 這個解決方案有助於迎合地點可能不存在的事實以及我並未每次創建新供應商這一事實 - 我正在更新現有供應商並與最近的地點聯繫 – Paul 2013-04-26 08:16:50