Как получить значение в запросе перед инициализацией списка - PullRequest
0 голосов
/ 28 мая 2018

Здравствуйте, я только начинаю с MVC и Entity Framework, и у меня есть проблема.Могу ли я получить значение моего Val4 в запросе?Я думаю, что я теряю время, инициализирую свой список дважды.

var query = from p in db.Table1
            join s in db.Table2 on p.ID equals s.sID
            join m in db.Table3 on s.sID equals m.ID
            group s by p into G
            select new Row
            {
                Val1 = G.Key,
                Val2 = G.Sum(x => x.someVal),
                Val3 = (from Z in db.Table4
                                 join p in db.Table5 on Z.ID equals p.ZamowienieID
                                 select p.otherVal).ToList().DefaultIfEmpty(0).Sum(),
                Val4 = 0,
            };

var list = query.ToList();

list.ForEach(x => x.Val4 = ((decimal)x.Val3 / (x.Val2 + (decimal)x.Val3)) * 100});

list = list.OrderbY(x =>x.Val4).ToList();

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Да, вы можете, но не напрямую в инициализаторе Row.

Чтобы можно было повторно использовать Val3 и Val3 как в Val4, так и в проекции.если бы вы использовали синтаксис метода LINQ, вы бы использовали промежуточную анонимную проекцию (Select).В синтаксисе запроса вы можете использовать let выражений для той же цели:

var query = from p in db.Table1
            join s in db.Table2 on p.ID equals s.sID
            join m in db.Table3 on s.sID equals m.ID
            group s by p into G
            let Val2 = G.Sum(x => x.someVal)
            let Val3 = (from Z in db.Table4
                        join p in db.Table5 on Z.ID equals p.ZamowienieID
                        select p.otherVal).DefaultIfEmpty(0).Sum()
            let Val4 = ((decimal)x.Val3 / (x.Val2 + (decimal)x.Val3)) * 100
            orderby Val4
            select new Row
            {
                Val1 = G.Key,
                Val2 = Val2,
                Val3 = Val3,
                Val4 = Val4,
            };
0 голосов
/ 28 мая 2018

Может быть лучше использовать getter свойства Val4.

public class Row
{
    public int Val1 { get; set; }

    public int Val2 { get; set; }

    public int Val3 { get; set; }

    public decimal Val4
    {
        get
        {
            return (decimal)Val3 / (Val2 + (decimal)Val3) *100;
        }
    }
}

И запрос выглядит так:

var query = from p in db.Table1
            join s in db.Table2 on p.ID equals s.sID
            join m in db.Table3 on s.sID equals m.ID
            group s by p into G
            select new Row
            {
                Val1 = G.Key,
                Val2 = G.Sum(x => x.someVal),
                Val3 = (from Z in db.Table4
                                 join p in db.Table5 on Z.ID equals p.ZamowienieID
                                 select p.otherVal).ToList().DefaultIfEmpty(0).Sum()
            };
var result = query.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...