Προς το περιεχόμενο

C# EF select valuetype


Προτεινόμενες αναρτήσεις

Δημοσ.

Πως κανουμε transformation σε valuetype;

 

Στο κατω σνιπ, πως θα αποφυγω το δευτερο transformation??? Το LatLng ειναι ValueType.

  class DriverProfileDB
    {
        public static List<DriverProfile> GetDrivers(long storeId)
        {
            using (var db = new PrimaryDatabase())
            {
                var q = from dp in db.td_driverprofiles
                        join shift in db.td_shifts on dp.EmployeeId equals shift.EmployeeId
                        join emp in db.td_employee on dp.EmployeeId equals emp.Id
                        where shift.StoreId == storeId && shift.Active > 0

                        select new 
                        {
                            Id = dp.Id,
                            lat = dp.CurrentPositionLat ?? 0,
                            lng = dp.CurrentPositionLng ?? 0,
                            ETA = dp.ETA ?? DateTime.MaxValue,//todo check calander 
                            Name = emp.Nick,
                            SpeedFactor = dp.SpeedFactor,
                            StopTimeOrder = dp.StopTimeOrder,
                            StopTimeStore = dp.StopTimeStore,

                        };
                return
                    q.ToList()
                    .Select(x => new DriverProfile
                    {
                        Id = x.Id,
                        CurrentPosition = new LatLng(x.lat,x.lng),
                        ETA = x.ETA,
                        Name = x.Name,
                        SpeedFactor = x.SpeedFactor,
                        StopTimeOrder = x.StopTimeOrder,
                        StopTimeStore = x.StopTimeStore
                    })
                    .ToList();
            }
        }
    }
Δημοσ.

Αυτό δεν παίζει?

      ....
      ....
      select new DriverProfile
      {
         Id = dp.Id,
         CurrentPosition = new LatLng
                   {
                     Lat= dp.lat,
                     Lng= dp.lng
                   },
         ETA = dp.ETA ?? DateTime.MaxValue,//todo check calander 
         Name = emp.Nick,
         SpeedFactor = dp.SpeedFactor,
         StopTimeOrder = dp.StopTimeOrder,
         StopTimeStore = dp.StopTimeStore,
        };
    return q.toList();
Δημοσ.

Το δεύτερο projection δε νομιζω οτι μπορείς να το αποφύγεις, αλλά τι σε πειράζει;

 

Το πρώτο ToList() που κάνεις από την άλλη όντως πειράζει, αλλά μπορείς να το αντικαταστήσεις πιο καλά με AsEnumerable(). Έτσι κι αλλιώς όταν φτάνεις να καλείς constructors φανερά έχεις περάσει το σημείο που τα πράγματα μπορούν να είναι queryable.

  • Like 1
Δημοσ.

Ξερω γω; Απλα μου φαινεται περιεργο να γραφω δυο φορες το ιδιο πραμα. Το αλλαξα σε enumerable.

 

Και κατι αλλο, για να μην ανοιγω αλλο θεμα.

public static void UpdateTripAndETA(Order order, int tripId)
        {
            using (var db = new PrimaryDatabase())
            {
                var tmp = new td_orders
                {
                    TD_Id = order.Id,
                    TD_ETA = order.ETA,
                    TD_TripId = tripId,
                    TD_RawAddress = "",
                    TD_Status = ""
                };


                db.td_orders.Attach(tmp);

                db.Entry(tmp).Property(x => x.TD_ETA).IsModified = true;
                db.Entry(tmp).Property(x => x.TD_TripId).IsModified = true;
                //db.Entry(tmp).Property(x => x.TD_Status).IsModified = false;
                //db.Entry(tmp).Property(x => x.TD_RawAddress).IsModified = false;
                db.SaveChanges();


            }
        }

γιατι δεν μπορω να τα αφησω null ;

Δημοσ.

Το δευτερο δεν νομιζω οτι γινεται να το αποφυγεις, αλλα στο πρωτο νομιζω μπορεις να κανεις απλα let Id = dp.Id, etc etc.

, εχω την εντυπωση οτι ειναι πιο φτηνο το let απο το new object. Δεν εχω windows μπροστα μου ομως για να το τσεκαρω :(.

Δημοσ.

το let απο F# δεν ειναι;

 

Ναι, αλλα το χρησιμοποιηεις και στα queries σε c#, πχ μπορεις να κανεις

 

from x in xxx

let x = xxx.Id + 105, 

where x > whatever

 

ενα πραγμα. 

Δημοσ.

Το δευτερο δεν νομιζω οτι γινεται να το αποφυγεις, αλλα στο πρωτο νομιζω μπορεις να κανεις απλα let Id = dp.Id, etc etc.

, εχω την εντυπωση οτι ειναι πιο φτηνο το let απο το new object. Δεν εχω windows μπροστα μου ομως για να το τσεκαρω :(.

 

Το let είναι ακριβώς το ίδιο πράγμα με το να κάνεις select into new anon type. Στη φάση που είσαι ακόμα queryable φυσικά αυτό δε σε απασχολεί γιατί δεν κάνεις instantiate τίποτα.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...