kashifjaat Ответов: 1

Как я могу сделать запрос с помощью LINQ в C# MVC с помощью entity frame work


How I can make Query Using LINQ in C# MVC Using Entity Frame work


Что я уже пробовал:

ALTER PROCEDURE [dbo].[Get_Highest_Price] 
	 @CatName nvarchar(50),
	 @Auc_Series nvarchar(50),
	 @AucNumber int
AS
BEGIN
     

SELECT a.AucNumber,a.SelNumber,a.IsNonAction
,ISNULL(Price,0) AS Price,ISNULL(BiddingPrice,0) as HighestPrice
,BiddingDateTime as HighestBiddingDateTime,a.AIN_Number
 FROM AuctionsSelectedNumber a
JOIN (SELECT AucNumber, MAX(BiddingPrice) AS MaxBP
      FROM AuctionsSelectedNumber
	  INNER join AuctionSeries on AuctionSeries.Auc_Series=AuctionsSelectedNumber.Auc_Series 
	  AND AuctionsSelectedNumber.Auc_Series=@Auc_Series
	  INNER join Category  on Category.Cat_ID=AuctionSeries.Cat_ID
	  AND Category.Cat_Name=@CatName

	  INNER join AIN_Auctions on AIN_Auctions.AIN_Number=AuctionsSelectedNumber.AIN_Number 
      LEFT join CustomerInfo on CustomerInfo.CusID=AIN_Auctions.CusID
      GROUP BY AucNumber) b
ON a.AucNumber = b.AucNumber AND a.BiddingPrice = b.MaxBP

AND  a.AucNumber=@AucNumber AND a.Auc_Series=@Auc_Series
	


END

lw@zi

То, что вы показали, - это хранимая процедура. Что вы пробовали с точки зрения LINQ?

kashifjaat

Я уже пробовал нечто подобное.

var t = от a в дБ.AuctionsSelectedNumbers
где.AIN_Number == Айн
выберите новый { AucNumber = а.AucNumber, ReservePrice = а.Цена,.BiddingDateTime, а.BiddingPrice, HighestBiddingPrice = (из B в дБ.AuctionsSelectedNumbers выберите новый { с = (б.BiddingPrice) }).Макс(х => У Х.с).Значение.ToString (), HighestAINUMBER = (from b in db.AuctionsSelectedNumbers select new {e=b.AIN_Number,с = (б.BiddingPrice)}).Макс(х => У Х.с).Значение.ToString (). Select (x=> a.AIN_Number).Список()};

1 Ответов

Рейтинг:
2

Jon McKee

Правка: Итак, скука ударила снова. Обновлено до правильного запроса LINQ. Это некрасиво. По-прежнему придерживаюсь своего предложения ниже :)

Инициализируйте переменные так, как вам нужно. Честно говоря, я бы потратил минуту, чтобы просмотреть базу данных и посмотреть, можно ли упростить эту процедуру. Или рассмотрим сопоставление хранимой процедуры с функцией (сохраняемые процедуры[^]).

Я понятия не имею о состоянии вашего ключа в БД но вы также должны проверить это - Как: сопоставить отношения с базой данных[^Вы можете значительно упростить запрос LINQ, воспользовавшись тем фактом, что LINQ сопоставляет отношения внешних ключей со свойствами навигации.

wchar_t[] categoryName;
wchar_t[] auctionSeries;
int auctionNumber;

var query = from a in (
                from a in db.AuctionsSelectedNumbers
                join s in db.AuctionSeries
                    on new { a.Auc_Series, AucSeries = a.Auc_Series }
                    equals new { s.Auc_Series, AucSeries = auctionSeries }
                join c in db.Category
                    on new { s.Cat_ID, Cat_Name = categoryName }
                    equals new { c.Cat_ID, c.Cat_Name }
                join ain in db.AIN_Auctions
                    on a.AIN_Number
                    equals ain.AIN_Number
                /* This left-join isn't doing anything as I point out below
                join customer in db.CustomerInfo
                    on ain.CusID
                    equals customer.CusID
                    into result
                from r in result.DefaultIfEmpty()
                */
                group a by a.AucNumber into result
                select new
                {
                    AucNumber = result.Key,
                    MaxBP = result.Max(bp => bp.BiddingPrice)
                }
            )
            join asn in db.AuctionsSelectedNumbers
                on new
                {
                    a.AucNumber,
                    BiddingPrice = a.MaxBP,
                    AucNumber2 = auctionNumber,
                    Auc_Series = auctionSeries
                }
                equals new
                {
                    asn.AucNumber,
                    asn.BiddingPrice,
                    AucNumber2 = asn.AucNumber,
                    asn.Auc_Series
                }
            select new
            {
                asn.AucNumber,
                asn.SelNumber,
                asn.IsNonAction,
                Price = (asn.Price != null) ? asn.Price : 0f,
                BiddingPrice = (asn.BiddingPrice != null) ? asn.BiddingPrice : 0f,
                asn.BiddingDateTime,
                asn.AIN_Number
            };         


Может быть, где-то опечатка. Я использовал читаемые имена, когда издевался над БД, поэтому вручную изменил их обратно. Также изменить 0f чтобы отразить тип столбцов по умолчанию (я использовал float).

Боковое примечание: Я не вижу смысла в том, чтобы LEFT JOIN в вашей процедуре. Поскольку никакой информации (вы только выбираете AucNumber и max BiddingPrice) из CustomerInfo таблица возвращается, она эффективно ничего не делает, если только я что-то не упускаю.