0

この SQL スクリプトを linq に変換するのに少し問題があります。「fn_Split_t」関数は、カンマ区切りの値を単純に分割します。私を混乱させているのは、そこにあるグループです。

    declare @count int
    select @count = COUNT(*) from  dbo.fn_Split_t(@portfolios)
    select 
         cc.CustodianCommentId
        ,cc.[Message]
        ,Symbol = NULL
        ,cc.DateStamp
        ,cc.AppUser
        ,PositionDate = @date
        ,cc.[Status]
        ,cc.Category
        ,cc.[Group]
    from dbo.CustodianComment cc
    join dbo.CustodianCommentPortfolio ccp on ccp.CustodianCommentId = cc.CustodianCommentId
    join dbo.CustodianPortfolio cp on ccp.CustodianPorfolioId = cp.CustodianPortfolioId
    join dbo.fn_Split_t(@portfolios) s on s.items = cp.PortfolioCode
    where  cp.PositionDate = @date 
    group by cc.CustodianCommentId,  cc.[Message], cc.DateStamp, cc.AppUser, cc.[Status], cc.Category, cc.[Group]
    having count(cc.CustodianCommentId) = @count
    order by cc.DateStamp desc

試行番号 1 の結果は次のとおりです。

from c in Context.Comments
join pc in Context.PortfolioComments on c.CommentId equals pc.CommentId
join p in Context.Portfolios on pc.PortfolioId equals p.PortfolioId
where portfolios.Contains(p.PortfolioCode)
&& p.PositionDate == EntityFunctions.TruncateTime(date)
group c by c.CommentId into g
where g.Count() > portfolios.Count()
select new
{
   CommentId = c.CommentId,

   Message = c.Message,
   DateStamp = c.DateStamp,
   AppUser = c.AppUser,
   PositionDate = p.PositionDate,
   Status = c.Status,
   Category = c.Category,
   CategoryId = c.CategoryId,
   Group = c.Group
}

ただし、匿名オブジェクトの c がスコープ内にないため、これは機能しません。ちなみに、portfolios は、SQL スクリプトで @portfolios に渡される csv 文字列と同じです。私は今これにちょっと立ち往生しているので、どんな助けも大歓迎です!ありがとうございました!

4

1 に答える 1

1
 string[] portfoliosArray = portfolios.Split(',', StringSplitOptions.RemoveEmptyEntries);

 from ... in ...
    where portoliosArray.Contains(p.PortfolioCode)
    select ...

また、ポートフォリオ コードのリストにスペースやその他の空白が含まれている場合は、エントリをトリミングする必要がある場合があります。

 string[] portfoliosArray = portfolios.Split(',', StringSplitOptions.RemoveEmptyEntries)
       .Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToArray();

元の SQL から読み取ると、次のものが必要になる場合があります。

    where portfoliosArray.All(p => c.PortFolios.PortfolioCode)

または:

    where c.Portfolios.All(p => portfoliosArray.Contains(p.Portfolio.Code))

あなたの要件については完全にはわかりませんが。

于 2013-02-11T17:29:53.947 に答える