30


10

期待通りに結果を返す左外部結合(下記)があります。 「正しい」テーブルからの結果を「最初の」ヒットに制限する必要があります。 何とかできますか。 現在、両方のテーブルのすべてのレコードについて結果を取得しています。右側のテーブル(写真)にいくつの結果があっても、左側のテーブルから1つの結果(アイテム)だけを表示します。

var query = db.items内のiからdb.photos内のpをi.id上でpに結合する。 .id、id = i.id、photoID = tp.PhotoID.ToString()};

GridView1.DataSource = query; GridView1.DataBind();

3 Answer


57


これはあなたのために仕事をします。

db.itemsのiからp = db.photos.Where(p2 => i.id == p2.item_id).FirstOrDefault()の順序でi.dateの降順で新しい{itemName = i.name、itemID = i.idを並べてください。 、ID = i.id、写真ID = p == null? null:p.PhotoID.ToString(); }

私は自分のモデルに対してそれを生成したときにこのSQLを得ました(そして投影のnameとsecond idカラムなしで)。

SELECT [t0]。[Id] AS [Id]、CONVERT(NVarChar、(SELECT [t2]。[PhotoId] FROM(SELECT TOP(1)[t1]。[PhotoId] FROM [dbo]。[フォト] AS [ [Item_Id] =([t0]。[Id]))AS [t2]))AS [PhotoId] FROM [dbo]。[Items] AS [t0] OR [BY]。 Id] DESC

プランを要求したとき、副問合せがこの結合によって実装されていることがわかりました。



4


次のようなことができます。

var q = from c in(argsのsからselect s).First()cを選択。

クエリの最後の部分周辺 それが機能するかどうか、またはどのような種類のSQLが生成されるのかわからない。


3


あなたがやりたいことはテーブルをグループ化することです。 これを行うための最良の方法は次のとおりです。

var query = from db.itemsのiをp in(db.photos group pのpからp.item_idによるgpに結合します。ここでgp.Count()> 0 select new {item_id = g.Key、Photo = g.First( i.idでp.item_idがtempPhoto.DefaultIfEmpty()内のtpからtempPhotoにtempPhotoに等しい順にi.date降順で選択new {itemName = i.name、itemID = i.id、id = i.id、photoID = tp .Photo.PhotoID.ToString()};

'' '' '

編集:これはDavid Bの話です。 ニックが私に頼んだので、私はこれをしているだけです。 ニック、あなたが適切であると感じるようにこのセクションを修正または削除してください。

生成されたSQLは非常に大きいです。 int 0(countと比較される)は、parameterを介して渡されます。

SELECT [t0] .X AS [ID]、CONVERT(NVarChar(MAX)、(SELECT [t6] .Y FROM(SELECT TOP(1)[t5] .Y FROM [dbo]。[写真] AS [t5]) (([[t4] .YはNULLです)AND([t5] .YはNULLです))OR(([[t4] .YはNOT NULL])AND([t5] .YはNOT NULL)AND([t4]。 Y = [t5] .Y))AS [t6]))AS [PhotoId] FROM [dbo]。[項目] AS [t0]クロス適用((SELECT NULL AS [EMPTY])AS [t1] OUTER APPLY( SELECT [t3] .Yから(SELECT COUNT(*)AS [値]、[t2] .Y [dbo]。[写真] AS [t2]グループ[[t2] .Y)AS [t3]どこ(( [t0] .X)= [t3] .Y)AND([t3]。[値]> @ p0))AS [t4])[BY [t0] .Z DESC

実行計画は3つの左の結合を明らかにします。 少なくとも1つは些細であり、数えるべきではありません(それはゼロをもたらします)。 ここでは十分な複雑さがあるため、効率のために問題を明確に指摘することはできません。 うまくいくかもしれません。