0

解決したエンティティへの LINQ に問題がありますが、正しい方法で解決したことを確認したいと考えています。

私は2つのクラスを持っています:

namespace ShopTest.Models
{

public class Shop
{
    public int ShopID { get; set; }
    public string Name { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Postcode { get; set; }
    public string Country { get; set; }
    public decimal Latitude { get; set; }
    public decimal Longitude{ get; set; }
}

[NotMapped]
public class ShopLocation : Shop
{
    public decimal AddressLatitude { get; set; }
    public decimal AddressLongitude { get; set; }
    public decimal DistanceFromAddress
    {
        get
        {
            return Convert.ToDecimal(
                        Math.Sqrt(
                                Math.Pow(Convert.ToDouble(this.Latitude - this.AddressLatitude), 2.0)
                                    +
                                Math.Pow(Convert.ToDouble(this.Longitude- this.AddressLongitude), 2.0)
                        )
                        * 62.1371192
                    );
        }
    }
}

}

LINQでクエリを実行するとき、私は最初に試しました:

decimal lat = Convert.ToDecimal(-33.8736510, NumberFormatInfo.InvariantInfo);
decimal lng = Convert.ToDecimal(151.2068896, NumberFormatInfo.InvariantInfo);

var nearbyShops = from c in db.Shops
                   where Math.Abs(c.lat - lat) < 0.25M &&
                         Math.Abs(c.lng - lng) < 0.25M
                   select new NearbyShopLocation()
                   {
                       StoreNumber = store.StoreNumber,
                       Address = store.Address,
                       City = store.City,
                       Region = store.Region,
                       CountryCode = store.CountryCode,
                       PostalCode = store.PostalCode,
                       Latitude = store.Latitude,
                       Longitude = store.Longitude,
                       AddressLatitude = lat,
                       AddressLongitude = lng
                   };

var nearbySortedShops = nearbyShops.ToList().OrderBy(s => s.DistanceFromAddress).ToList();

ただし、「エンティティまたは複合型 'ShopTest.Controllers.Shops' は、LINQ to Entities クエリで構築できません」というエラーが表示され続けました。

以下のコードで問題を修正しましたが、なぜこれが機能するのか意味がありません.MVCが初めてなので、誰かが説明してくれることを願っています. :-)

var nearbyShops = (from c in db.Shops
                  where Math.Abs(c.lat - lat) < 0.25M &&
                        Math.Abs(c.lng - lng) < 0.25M
                  select new 
                  {
                      StoreNumber = c.StoreNumber,
                      Address = c.Address,
                      City = c.City,
                      Country = c.Country,
                      PostalCode = c.PostalCode,
                      Latitude = c.Latitude,
                      Longitude = c.Longitude,
                  }).ToList().Select(l => new ShopLocation
                  {
                       Name = l.Name,
                       City = l.City,
                       State = l.State,
                       Country = l.Country,
                       Lat = l.Lat,
                       Lng = l.Lng,
                       AddressLatitude = lat,
                       AddressLongitude = lng
                  }).ToList().OrderBy(s => s.DistanceFromAddress).ToList();

私はこれを正しく行いましたか?より良い方法はありますか?

4

1 に答える 1

1

EFには、クエリでマップされたエンティティを手動で作成できないという制限があります。つまり、これはできません。

 var shops = from s in db.Shops where ... select new Shop { ... };

これには、派生エンティティも含まれます。そのため、最初にToListを呼び出してLinq-to-Objectsに切り替える必要があります。

 var shopse = db.Shops.Where(...).ToList().Select(s => new Shop { ... });

通常、次の点で問題ありません。

var nearbyShops = 
             (from c in db.Shops
              where Math.Abs(c.lat - lat) < 0.25M &&
                    Math.Abs(c.lng - lng) < 0.25M
              select c).ToList()
             .Select(l => new ShopLocation
              {
                   Name = l.Name,
                   City = l.City,
                   State = l.State,
                   Country = l.Country,
                   Lat = l.Lat,
                   Lng = l.Lng,
                   AddressLatitude = lat,
                   AddressLongitude = lng
              }).OrderBy(s => s.DistanceFromAddress).ToList();
于 2012-04-25T07:35:24.130 に答える