2

短い: この質問を要約する簡単な方法は、linq の結合に条件を適用できますか?

次のSQLクエリがあります:

select cdm.cashID, cdm.DateTimeTillOpened, cdm.DateTimeTillClosed, o.OrderID, o.OrderDate
from CashDrawsMonies cdm
join Orders o on o.OrderDate >= cdm.DateTimeTillOpened
              AND o.OrderDate <= cdm.DateTimeTillClosed
join Users u on o.UserID = u.UserID
where u.UserID = 'C3763CC6-D1C5-4EF3-9B83-F7AB3BF8827A'
group by cdm.cashID, cdm.DateTimeTillOpened, cdm.DateTimeTillClosed, o.OrderID, o.OrderDate
order by o.OrderDate desc

代替 SQL@

select *
from CashDrawsMonies cdm
where exists
(
    select * 
    from Orders o 
    join Users u on o.UserID = u.UserID
    where 
        o.OrderDate >= cdm.DateTimeTillOpened and 
        o.OrderDate <= cdm.DateTimeTillClosed and
        u.UserID = 'C3763CC6-D1C5-4EF3-9B83-F7AB3BF8827A'
)

ほとんどのクエリを変換できますが、Linq の結合では常に等しいキーワードを要求し、>= や <= のようなものではなく、SQL で結合に条件を設定できるようにします。これが、どのように変換するのか頭を悩ませている理由です。

私のコード内の linq-To-Entites モデル (c#) は次のように設定されています。

Cache.Model.Orders
Cache.Model.CashDrawMonies
Cache.Model.Users

助けに感謝します。

試行 1:

                var results = from o in Cache.Model.Orders
                          from c in Cache.Model.CashDrawMoneys
                          join u in Cache.Model.Users on o.UserID equals u.UserID
                          where c.DateTimeTillOpened >= o.OrderDate
                          && c.DateTimeTillClosed <= o.OrderDate
                          select c;

試行 2:

            var results = from c in Cache.Model.CashDrawMoneys
                          from o in Cache.Model.Orders
                          where c.DateTimeTillOpened >= o.OrderDate
                          && c.DateTimeTillClosed <= o.OrderDate
                          group c by new { c.cashID, c.DateTimeTillOpened, c.DateTimeTillClosed, o.OrderID, o.OrderDate, o.UserID } into temp
                          from t in temp
                          join u in Cache.Model.Users on t.UserID equals u.UserID
                          where t.UserID == selectedUser.UserID
                          select t;

結果を返しません .... : S

アップデート:

私は自分のSQLを書き直しました。SQLの2番目の部分は、私が知りたいことを正確に行います。どういうわけか私のためにそれを変換する誰かが必要ですか???

Linqer を使用して変換された SQL バージョン 2:

from cdm in db.CashDrawMoneys
where
    (from o in db.Orders
    join u in db.Users on o.UserID equals u.UserID
    where
      o.OrderDate >= cdm.DateTimeTillOpened &&
      o.OrderDate <= cdm.DateTimeTillClosed &&
      u.UserID == new Guid("C3763CC6-D1C5-4EF3-9B83-F7AB3BF8827A")
    select new {
      o,
      u
    }).FirstOrDefault() != null
select new {
  cdm.UserID,
  cdm.DateTimeTillClosed,
  cdm.DateTimeTillOpened,
  cdm.LooseChange,
  cdm.Fivers,
  cdm.Tens,
  cdm.Twenties,
  cdm.Fifties,
  cdm.IsOpen,
  cdm.IsClosed,
  cdm.ClosingValue,
  cdm.OpeningValue,
  cdm.cashID
}

nbut をコンパイルすると、次のエラーが発生します。

「DbIsNullExpression への引数は、プリミティブ型または参照型を参照する必要があります。」

4

2 に答える 2

1

最初の試みの結合は、ほぼ正しいように見えます。しかし、比較演算子を好転させましたか?

where c.DateTimeTillOpened **>=** o.OrderDate && c.DateTimeTillClosed **<=** o.OrderDate

アップデート:

それをSQLに変換する方法がわからないため、LINQ2EF内で新しいオブジェクトを作成することはできません。

u.UserID == new Guid("C3763CC6-D1C5-4EF3-9B83-F7AB3BF8827A")

linq ステートメントの前に GUID を定義してから、変数を使用する必要があります

var gid = new Guid("C3763CC6-D1C5-4EF3-9B83-F7AB3BF8827A")

from cdm in db.CashDrawMoneys
where
    (from o in db.Orders
    join u in db.Users on o.UserID equals u.UserID
    where
    o.OrderDate >= cdm.DateTimeTillOpened &&
    o.OrderDate <= cdm.DateTimeTillClosed &&
    u.UserID == gid
于 2012-06-09T14:45:43.890 に答える
0

以下は私が何とか手に入れたものです:

                var results = from cdm in Cache.Model.CashDrawMoneys
                          where (from o in Cache.Model.Orders
                                join u in Cache.Model.Users on o.UserID equals u.UserID
                                where o.OrderDate >= cdm.DateTimeTillOpened && o.OrderDate <= cdm.DateTimeTillClosed &&
                                    u.UserID == selectedUser.UserID
                                select o).FirstOrDefault() != null
                          select cdm;

それはあなたが得たものにかなり近く、私が'selectedUser'オブジェクトを持っていたので、それは私のためにすでに作成されていたので、GUIDについて心配する必要はありませんでした。

最後の行は次のようになります。

                                    select o).Any()
                          select cdm;

しかし、私は大騒ぎしていません。2つのバリエーションがありますが、最初のバージョンを使い続けるつもりです。

于 2012-06-11T21:04:13.857 に答える